每当 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;
}
}
最后,我检查了isCachedLicens
e 是否在LicenseCheckerCallback
:
@Override dontAllow
和. 的以下位置@override applicationError
。如果isCachedLicense
是真的,那么我让用户转发。
此外,完整的源代码位于此处。