簡體   English   中英

保護Android應用敏感數據的最佳方法?

[英]Best way to secure Android app sensitive Data?

是的,這是一個非常普遍的問題,但我正在試圖找到一種最好的方法來處理觸及基礎的應用程序,該應用程序將敏感數據分發到應用程序。 任何鏈接,一般信息建議等..將不勝感激。

由於應用程序將存儲從數據庫中恢復的持久數據一段時間......所有內容都變得有些敏感。

在設備上存儲敏感數據

這在很大程度上取決於您的受眾。 通常,Android OS禁止應用程序通過經過驗證的Linux文件權限訪問彼此的文件(即數據庫,首選項文件,存儲在應用程序私有目錄中的常規文件)。 但是,在有根設備上,應用程序可以獲取root訪問權限並讀取所有內容。 一些要考慮的事情:

  1. 如果您知道您的用戶不會擁有root用戶(例如,如果您不通過Android Market分發應用程序,但僅限於您的公司,或類似的東西),您可以簡單地依賴Android的基於文件系統的安全性。
  2. 如果用戶確實獲得root訪問權限,那么他會非常小心他給予的特權應用程序
  3. 如果一個應用程序確實獲得root訪問權限,它可能會造成很大的破壞。 您應用中的信息可能是用戶最不擔心的問題。
  4. 生根導致零保修。 包括在應用程序中。 您不能對在有根電話上泄露信息負責。

總而言之,如果您的信息不是超級敏感的(例如信用卡信息),我建議您堅持使用Android提供的默認安全性(即以純文本保存所有內容,知道其他應用無法訪問它)。

否則,加密是可行的方法。 這不是100%安全(黑客可以解組你的應用程序並弄清楚如何解密數據),但這是一個很大的痛苦,破解並將阻止大多數黑客。 特別是如果你用ProGuard之類的東西混淆你的代碼。


將敏感數據從服務器傳輸到設備

你有幾個選擇。 首先,始終使用HTTPS。 啟用HTTPS后,我建議采取兩種額外的安全措施:

  1. 使用API​​密鑰系統。 在所有請求中包含此API密鑰,並在發送任何響應之前在服務器端進行檢查。 請記住,由於您使用的是HTTPS,攻擊者無法使用網絡嗅探器來查找您的API密鑰。 但是,如果有人反編譯您的應用程序,這很容易理解,這就是為什么您可以進一步混淆它(除了使用ProGuard)。 例如,您可以將API密鑰分解為代碼周圍的部分(例如,作為兩個或三個類中的靜態成員)。 然后,當您發送請求時,您只需連接所有這些部分。 您甚至可以應用其他類型的轉換(例如位移),以便更難以從反編譯代碼中找出。
  2. 您可以在每次發送請求時生成密鑰。 該密鑰將通過使用只有您知道的一些邏輯生成,以便您也可以在客戶端和服務器端實現它。 例如,請求可以包含以下參數:
    time=1321802432&key=[generated-key]
    其中generated-key是從time參數生成的。 例如: md5(time + salt) 當服務器收到此請求時,它可以做兩件事:
    1. 檢查key是否確實等於md5(time + salt) (請注意,只有客戶端和服務器知道鹽,並且它可以與上面的API密鑰類似地進行模糊處理),並且
    2. 檢查過去的time不是太遠(例如,如果過去的時間超過1-2分鍾,請考慮請求無效)。

如果您還在進行純HTTP請求,那么第二種方法會更有用,每個人都可以看到正在發送的參數。 而且,從反編譯代碼中找出它要困難得多。 特別是如果您將鍵計算邏輯分布在多個類中。

請注意, 沒有什么能夠破解你的應用程序。 您可以根據需要進行模糊處理,如果黑客真的決心獲取您的數據,他將能夠通過反編譯您的應用程序並花費許多不眠之夜通過您的代碼並弄清楚請求是如何形成的。 保護數據的唯一真正方法是向用戶提供密碼,除了完成我上面寫的所有工作。 您無法從反編譯代碼中獲取僅存在於某人(用戶)頭部的密碼。

(來自Google搜索)

我最近一直在研究這個問題,感謝Google和Bing的搜索,這個頁面已經出現了很多。 用於安全地在設備上存儲數據的廣泛接受的過程是使用諸如AES的強加密算法。 更難的問題是“AES需要一個安全的密鑰。你用鑰匙做什么?”

谷歌最近發布了針對應用程序的基於雲的存儲解決方案,因此如果情況允許,您可以考慮將密鑰存儲在那里。 否則,它似乎在服務器之外獲取密鑰更好。 如果您可以讓用戶打入PIN,那實際上效果最好。 您可以進行密碼派生以存儲密碼,您可以重做派生以驗證密碼

沒有“用戶在PIN中打孔”部分,我沒有找到很多這個問題的好答案。 但是,如果您必須使用APP存儲一個,請不要使用密鑰。 至少,使用安全密碼生成器和/或類似PBKDF2(基於密碼的派生函數2)的派生函數生成密鑰。

如果我正確閱讀帖子,谷歌確實說過一種方法是在應用程序第一次啟動時生成密鑰,通過MODE_PRIVATE標志將密鑰存儲到許多文件I / O操作中,並將其用作密鑰。 您還可以基於該主密鑰導出其他密鑰,而NIST實際上也會根據這些內容提出建議。

無論是否信任主密鑰方法,我都會留給您。 此密鑰將在root設備上公開。 我也承認我還在研究這個問題

Android上的每個應用程序都在安全的沙箱環境中運行,因此如果沒有正確的握手,系統上的其他進程將無法訪問您的代碼或私有數據。 但是,由於應用程序設計不佳,仍然存在許多漏洞。 來自Android開發者網站的鏈接建議您提供一些安全性方面的好建議 - https://developer.android.com/training/articles/security-tips.html

如果您想要確保用戶除了查看您的應用程序之外無法查看數據,那么加密確實是唯一的方法。 如果設備已植根,則用戶甚至可以訪問“受保護”存儲。 即使加密也不是完全安全的,因為您需要在某個時刻解密數據才能顯示它。 你會勸阻休閑瀏覽器,但不會勸阻黑客。

在HTTPS上使用SSL來傳輸數據而不是HTTP,您需要在Web服務器上設置證書,而不是非常確定它是如何工作的。

如果您真的關心數據,那么在發送數據之前,請使用獨特的算法對其進行進一步加密,然后在到達應用程序時對其進行解密。 我想這就是它的全部......除非你需要一些非常強大的東西,然后根據TCP和/或使用另一個端口開發自己的協議..也許這會有所幫助

http://en.wikipedia.org/wiki/Secure_Sockets_Layer http://developer.android.com/reference/javax/net/ssl/package-summary.html http://blog.synyx.de/2010/06/機器人和自簽署的SSL-證書/

至於在應用程序中存儲數據,您可以在存儲之前加密數據,或者您可以使用除SQLite之外的其他格式以提高安全性,因為您可以非常輕松地使用瀏覽器查看sqlite數據庫。

除非電話根植,否則不應該從中提取數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM