2016-04-10 87 views
5

什麼是在應用程序代碼中存儲API密鑰,數據庫加密密鑰等的最佳位置,以便任何人都無法通過反編譯代碼來獲取它?我使用proguard來混淆代碼,但它在字符串上不起作用。在Android應用程序中存儲密鑰的最佳位置是什麼?

+2

這個問題是[問已經(http://stackoverflow.com/questions/14570989/best-practice-for-storing - 私人-API的鍵合機器人)的[最佳實踐中的Android存儲私有API鍵] – Dmitriy

+0

可能的複製(https://stackoverflow.com/questions/14570989/best-practice-for-storing-private-api -keys-in-android) – Suhaib

回答

2

沒有辦法將它們存儲在應用程序。該應用程序可以反編譯或執行修改後的設備,提供更多的訪問應用程序的內存,或應用程序可以修改攻擊者添加額外的網絡或存儲/數據庫通信記錄等。

對於身份驗證服務器,您的應用程序應該可能通過交換用戶輸入的憑證來獲取授權令牌(或類似),或通過從AccountManager或類似的API獲取這些授權令牌來獲得授權令牌。您也可以使用SafetyNet Attest API(https://developer.android.com/training/safetynet/index.html)向您的服務器證明它是您的應用程序,並使用您的簽名密鑰進行請求。

對於數據庫加密,應用程序可以生成設備上的隨機加密密鑰,或者鏈接到用戶輸入憑證或存儲在Android的密鑰庫,或者單純依靠由Android提供給應用程序的保護。這取決於你的威脅模型(即,爲什麼你認爲你需要加密的數據庫?)

+0

這是如何防止流氓應用程序在與服務器通話時模擬您的應用程序? – pete

+0

您的服務器可能要求所有請求(或登錄請求或類似)都包含SafetyNet認證令牌/斷言。然後,服務器將驗證(1)認證令牌/斷言確實是由Google的SafetyNet Attest基礎架構發佈的;(2)從令牌/斷言中提取程序包名稱+應用程序的簽名證書,並檢查它們是否與您的應用程序匹配。從本質上講,您的服務器將相信很難誤導SafetyNet Attest基礎設施(客戶端和服務器端)。 –

相關問題