我正在寫一個移動應用程序來訪問一個在線數據庫(我更感興趣的是高級算法/協議比平臺特定的實現)。
由於保持數據庫更新需要大量的工作,我只想限制對我的贊助應用程序的訪問(我不希望其他應用程序免費利用我的數據庫)。爲此,我需要驗證應用程序本身,但我該怎麼做?
如果我在應用程序中存儲某種憑據,有人可能會嘗試反彙編程序,檢索數據並繞過我的應用程序編寫自己的應用程序(即使我加密憑證,仍然需要將解密密鑰存儲在某處)。 )
我正在寫一個移動應用程序來訪問一個在線數據庫(我更感興趣的是高級算法/協議比平臺特定的實現)。
由於保持數據庫更新需要大量的工作,我只想限制對我的贊助應用程序的訪問(我不希望其他應用程序免費利用我的數據庫)。爲此,我需要驗證應用程序本身,但我該怎麼做?
如果我在應用程序中存儲某種憑據,有人可能會嘗試反彙編程序,檢索數據並繞過我的應用程序編寫自己的應用程序(即使我加密憑證,仍然需要將解密密鑰存儲在某處)。 )
你想要做的是採用相互認證的SSL,這樣你的服務器將只接受來自你的應用的傳入連接,你的應用只會與你的服務器通信。
這是高層次的方法。創建一個自簽名服務器SSL證書並部署到您的Web服務器上。爲此,您可以使用Android SDK附帶的keytool(如果您使用的是Android;其他平臺也有相似的工具)。然後創建一個自簽名客戶端,並將其作爲資源部署在您的應用程序中的一個自定義密鑰庫中(keytool也會生成這個)。將服務器配置爲需要客戶端SSL身份驗證,並僅接受您生成的客戶端證書。配置客戶端使用該客戶端證書來標識自身,並且只接受您在服務器上安裝的那一部分服務器端證書。
如果您的應用程序以外的某個人/某個人嘗試連接到您的服務器,則SSL連接將不會被創建,因爲服務器將拒絕未顯示您已包含在您的應用程序中的客戶端證書的傳入SSL連接。
這是一個比這裏保證的更長的答案。我建議分步實施,因爲網上有資源介紹如何處理Android中的自簽名SSL證書,包括服務器和客戶端。在O'Reilly出版的我的書「Application Security for the Android Platform」中還有一個Android應用程序的完整漫遊。
現在......您是對的,有權訪問移動應用程序的人可以恢復與客戶端證書關聯的私鑰。這將在BKS密鑰庫中進行加密,但您的應用程序需要提供密碼才能打開該密鑰庫。因此,有人可以對您的應用程序進行逆向工程(在Android平臺上相當簡單),獲取密碼,獲取密鑰庫並解密它以恢復客戶端私鑰。您可以通過對應用進行模糊處理來減輕這一點,使密鑰庫密碼逆轉更加困難,或者要求用戶登錄到應用程序並使用該密碼來獲取密鑰庫的密碼等等,這實際上取決於級別您願意承擔您的應用程序的風險。