我想加密用戶指定的字符串列表。用於加密和解密此數據的AES密鑰必須保存在設備上,以便用戶每次需要時都可以使用它解密數據。我已經讀過使用Keystore是存儲密鑰的一個很好的選擇,但是我已閱讀的大多數指南都將它與簽名應用程序相關聯,這不完全是我想要的。我的應用程序要求用戶輸入一個密碼,然後使用用密碼解鎖的密鑰解密字符串數據。我該怎麼做呢?安全地在Android設備中存儲AES密鑰
謝謝。
我想加密用戶指定的字符串列表。用於加密和解密此數據的AES密鑰必須保存在設備上,以便用戶每次需要時都可以使用它解密數據。我已經讀過使用Keystore是存儲密鑰的一個很好的選擇,但是我已閱讀的大多數指南都將它與簽名應用程序相關聯,這不完全是我想要的。我的應用程序要求用戶輸入一個密碼,然後使用用密碼解鎖的密鑰解密字符串數據。我該怎麼做呢?安全地在Android設備中存儲AES密鑰
謝謝。
它很難回答你的問題,而沒有你以一種確切的方式「安全地」定義。你在談論其他應用程序的安全性嗎?針對其他用戶的安全?安全防盜設備?或防止損失的安全?
另外,你在說什麼安全級別?數據在給定密鑰下的加密是否足夠敏感,以便能夠認真考慮密鑰的存儲方式?
據我的理解,如果數據具有高度敏感性,您應該使用基於密碼的密鑰派生函數(如PBKDF#2,Bcrypt或Scrypt)直接從密碼派生密鑰。通過這種方式,關鍵材料不需要直接存儲在設備上。
如果您打算無論出於何種原因存儲主加密密鑰,請使用密碼密鑰進行加密,並在SharedPreferences下將其存儲爲Base64字符串,並使用MODE_PRIVATE
來保護它免受其他應用程序的侵害。即使密鑰被惡意用戶/設備盜用,但沒有正確的密碼密鑰,密鑰材料本身也是無用的。
如果您想防止丟失密鑰,則不應將密鑰存儲在設備上,而應存儲在您自己的服務器上,並再次使用密碼密鑰進行加密,這樣數據庫的妥協也不會導致數據泄露。
總之,我建議你儘量不要將任何種類的私鑰存儲到設備本身,而是使用密碼派生密鑰作爲所有密碼操作的主密鑰。保留在公鑰加密和已知公鑰證書中生成的私鑰的密鑰庫。
我以前試過PBKDF2,但每次都會生成不同的密鑰,即使密碼是相同的。 – sm123 2015-02-08 20:23:42
另外,即使我要生成每次必須相同的PBKDF2密鑰,我是否也不需要對鹽進行硬編碼,這可能會被攻擊者檢索到? – sm123 2015-02-08 20:43:32
@ gl321第一次隨機生成salt並將其存儲在共享首選項中。算法的salt和參數不是私有的,因爲攻擊者可以在沒有任何安全風險的情況下檢索它們,只要確保每個用戶的salt是隨機的(禁止爲所有用戶生成彩虹表)。一旦生成了初始密鑰,確保鹽不會丟失(也可能存儲在您自己的服務器上)。編碼密鑰可以在用戶下次登錄時定期更改,並生成新的鹽。 – initramfs 2015-02-09 03:52:33