端到端照片儲存
我的任務是開發一個需要安全儲存使用者拍攝的照片的應用程序,我一直在努力想出一種方法來做到這一點。
到目前為止,我的想法如下:
- 當使用者首次登錄應用程序時,將密碼和鹽(儲存在數據庫中)一起輸入到密鑰派生函式以生成雜湊
- 使用此雜湊加密 AES 密鑰
- 將其儲存在數據庫中
這樣,當使用者登錄到應用程序時,他們可以請求加密的 AES 密鑰並通過生成與密碼產生的相同雜湊來解密它。
使用此 AES 密鑰,他們可以在將照片發送到伺服器之前對照片進行加密,並在收到照片後對其進行解密。
這是一種可行的方法嗎?有更好的方法嗎?
任何幫助,將不勝感激。
到目前為止,我的想法如下:
- 當使用者首次登錄應用程序時,將密碼和鹽(儲存在數據庫中)一起輸入到密鑰派生函式以生成雜湊
- 使用此雜湊加密 AES 密鑰
- 將其儲存在數據庫中
首先,確保使用者的密碼具有良好的強度。一般來說,即使有強大的加密方法,這也是最薄弱的地方。通常的建議是告訴/教他們使用dicewire方法(參見xkcd 936)。這將使密碼具有良好的強度。如果使用者的密碼很弱,那麼密碼破解方法會破壞加密;John the Ripper 密碼破解者或Hashcat搜尋。它是純密文攻擊,但是,圖像文件的文件結構將有助於確定正確的密鑰。
您可以使用 PBKDF2 等基於密碼的密鑰派生,或者更好地使用 Argon2 作為 2015 年密碼競賽的獲勝者,為每個文件派生一個具有隨機 256 位鹽的密鑰。隨機鹽可以附加到加密文件中。如果可能,首選 Argon2。您還可以使用HKDF派生密鑰。
這種應用程序的一個關鍵部分是使用者可以忘記他們的密碼。在這種情況下,所有照片都會失去。使用者必須自己採取對策,在某處編寫,使用 keypass 等。您的應用程序的其他機制取決於應用程序的環境和風險。
對於加密方法,請使用 AES256-GCM *或更喜歡 ChaCha2-Poly1305,因為它比 GCM 更容易使用。它們是經過身份驗證的加密方法,可為您提供機密性、完整性和身份驗證。對於那些,您需要派生一個 IV/nonce,並且可以隨機生成,因為您為每個文件生成一個新密鑰。並且永遠不要忽略標籤不匹配錯誤。如果您的應用程序是在雲上儲存文件的圖像處理應用程序,則在上傳修改後的文件時需要小心。如果密鑰和 IV 相同,那麼觀察者可以從差異中洩露資訊。
如果您不想為每個文件使用新密鑰,則需要注意 IV 重用。在這種情況下,nonce 抗誤用方案 SIV可以與 AES-GCM-SIV 一起使用。
*雖然AES-128 是安全的,但更喜歡 AES-256 來抵禦多目標攻擊