每当Android Market Licensing ping服务器返回GRANT_ACCESS pong时,我都会缓存用户的身份验证。混淆密钥缓存中的漏洞? Android Licensing
有没有人看到这个策略的任何漏洞?我相信它非常强大,因为我混淆了一个关键字,唯一没有混淆的方法就是知道盐。现在,有人可以想象打开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;
}
}
最后,我检查是否isCachedLicens
e在LicenseCheckerCallback
的以下位置: @Override dontAllow
和@override applicationError
。如果isCachedLicense
是真的,那么我让用户转发。
此外,完整的源代码位于here。
我确实使用了经过验证的加密库,请参阅完整的代码以供参考。 – hunterp 2010-12-11 02:53:03
这是更好的一步 - 图书馆似乎做了一个体面的工作。攻击者现在必须分别解密每个设备的数据,并有足够的权限访问设备才能运行设备特定的解密器。尽管如此,全球盐仍然是一个弱点。而且,由于它看起来像是将其作为库分发,因此最终用户无法填充自己的盐值会增加危险。可能性是开发人员过多会使其保持您输入的值 - 我会将其更改为每个设备单独生成的值。 – blueberryfields 2010-12-11 04:22:21
如果您查看参考资料,我已经将特定于设备的信息加入到加密组合中(我也重新编辑了我的问题以将此信息包含在顶部) – hunterp 2010-12-11 17:11:17