2010-12-11 60 views
6

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

回答

1

使用鹽進行混​​淆一般來說是一個弱策略。攻擊者只需要弄清楚鹽分的含量,一旦你知道你在找什麼,就很容易做到,而且無需直接訪問你的應用程序即可完成。一旦鹽被發現(任何人),我們所有的安裝基地都已被破壞。

最好的辦法是,不要使用帶有固定密鑰的混淆算法,而要使用經過驗證的加密庫+算法,該密鑰對於用戶或正在運行的設備是唯一的。

+0

我確實使用了經過驗證的加密庫,請參閱完整的代碼以供參考。 – hunterp 2010-12-11 02:53:03

+1

這是更好的一步 - 圖書館似乎做了一個體面的工作。攻擊者現在必須分別解密每個設備的數據,並有足夠的權限訪問設備才能運行設備特定的解密器。儘管如此,全球鹽仍然是一個弱點。而且,由於它看起來像是將其作爲庫分發,因此最終用戶無法填充自己的鹽值會增加危險。可能性是開發人員過多會使其保持您輸入的值 - 我會將其更改爲每個設備單獨生成的值。 – blueberryfields 2010-12-11 04:22:21

+0

如果您查看參考資料,我已經將特定於設備的信息加入到加密組合中(我也重新編輯了我的問題以將此信息包含在頂部) – hunterp 2010-12-11 17:11:17