每當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