每当Android Market Licensing ping服务器返回GRANT_ACCESS pong时,我都会缓存用户的身份验证。
有没有人发现这个策略有任何漏洞?我相信它是非常强大的,因为我混淆了一个密钥,而解开它的唯一方法就是知道它的盐。现在,可以想象有人可以打开apk并寻找盐,但这并不是真正的裂缝水平,我认为太重要了,不必担心。
如您所见,设备特定信息正被添加到模糊处理技术中。
// Try to use more data here. ANDROID_ID is a single point of attack.
String deviceId = Secure.getString(getContentResolver(), Secure.ANDROID_ID);
obfuscator = new AESObfuscator(SALT, getPackageName(), deviceId);
mChecker = new LicenseChecker(this, new ServerManagedPolicy(this, obfuscator), BASE64_PUBLIC_KEY ); 接下来是持久化数据的创建:
public void allow() {
SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0);
SharedPreferences.Editor editor = settings.edit();
String uid = UUID.randomUUID().toString();
if(!settings.contains(ACCESS_KEY)) {
editor.putString(ACCESS_KEY,uid);
editor.commit();
}
if(!settings.contains(OBFU_ACCESS_KEY)) {
String obfu = obfuscator.obfuscate(uid);
editor.putString(OBFU_ACCESS_KEY,obfu);
editor.commit();
}然后,我使用另一种方法检查缓存内容的状态:
boolean isCachedLicense() {
SharedPreferences settings = getSharedPreferences(PREFERENCES_EULA, 0);
if(settings.contains(ACCESS_KEY) && settings.contains(OBFU_ACCESS_KEY)) {
String accessKey = settings.getString(ACCESS_KEY, "");
String obAccessKey = settings.getString(OBFU_ACCESS_KEY, "");
try {
if(accessKey.equals(obfuscator.unobfuscate(obAccessKey))) {
return true;
} else {
return false;
}
} catch (ValidationException e) {
e.printStackTrace();
return false;
}
} else {
return false;
}
} 最后,我检查了isCachedLicense是否位于LicenseCheckerCallback的以下位置:@Override dontAllow和@override applicationError。如果isCachedLicense为真,那么我让用户转发。
另外,完整的源代码可以在here上找到。
发布于 2010-12-11 09:11:18
一般来说,用盐进行混淆是一种薄弱的策略。攻击者只需要弄清楚salt,一旦你知道你要找的是什么,这是相当直接的,并且可以在不直接访问你的应用程序的情况下完成。一旦盐被发现(被任何人发现),我们所有的安装库都会遭到破坏。
您最好的选择是,不要使用具有固定密钥的模糊算法,而是使用一个经过验证的加密library+algorithm,其密钥对于用户或您正在运行的设备都是唯一的。
https://stackoverflow.com/questions/4414449
复制相似问题