Android Market Licensing ping サーバーが GRANT_ACCESS pong を返すたびに、ユーザーの認証をキャッシュしています。
この戦略に脆弱性が見られる人はいますか? キーを難読化しているため、非常に強力であると思います。難読化を解除する唯一の方法は、ソルトを知ることです。さて、誰かがapkを開いてsaltを探すことも考えられますが、これは実際には心配するほど重要ではないクラッキングのレベルではありません.
ご覧のとおり、デバイス固有の情報が難読化手法に追加されています。
// 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
また、完全なソース コードはこちらにあります。