登錄安全性和儲存在 Argon2i 中的密碼的明文以通過岩鹽保險箱派生密鑰?
我正在使用 Symfony 4。我在下面的所有 Argon2 東西上設置了參數,這樣每次迭代需要 1 秒。該網站應該對 HIPAA 資訊進行加密。
基本上我有一張這樣的桌子
username varchar(50), password varchar(255)
在密碼欄位中,我使用 Argon2i 儲存密碼。使用者登錄並驗證他們在數據庫中的密碼(這一切都通過 Symfony 登錄完成)。之後,使用者將看到另一個螢幕以輸入密碼。他們輸入第二個密碼(該密碼在公司所有員工之間共享)。
我有另一張桌子
key_pass varchar(255), salt varchar(50)
第二個密碼與 password_verify 一起使用,與 key_pass 的值一起使用,key_pass 是儲存在 Argon2i 中的密碼。如果成功,那麼我使用Halite(在這種情況下由 libsodium 提供的 scrypt)使用 salt 的值派生密鑰。基本上整個事情看起來像這樣:
if (password_verify($view->getPassword(), $encryption->getKeyPass())) { $encryption_key = EncryptionKey::deriveFromPassword( $view->getPassword(), $encryption->getSalt() ); }
該密鑰將用於解密數據庫中的其餘數據。
所以三個問題:
1)這種形式的雙重身份驗證甚至有助於安全嗎?我的意思是,如果攻擊者最終獲得第二個密碼,他們甚至不需要第一次登錄(假設他們可以直接訪問數據)。我想這只是讓網站更安全,因為他們甚至無法在沒有通過網站的第一個密碼的情況下攻擊第二個密碼?
- 使用第二個密碼來導出密鑰安全嗎?
3)假設#2是“是”,如果我想更改第二個密碼(即員工離開公司),這是否可能不使用新的派生密鑰重新加密所有數據?如果不是,有哪些可能的實現/替代方案可以允許這樣做?也許在數據庫中儲存另一個加密的密鑰並使用上述派生密鑰來解密該密鑰,然後該密鑰是解密數據庫中其他數據的真正密鑰?如果這行得通,Halites Symmetric::encrypt 對於第二個密鑰是否足夠安全?
謝謝你的幫助!幾個月來我一直在研究這些東西,但我不是安全專家 - 真的很感謝有人驗證我提出的所有這些
1. 這種形式的雙重認證甚至有助於安全嗎?
可能,但總的來說,要求使用者記住兩個密碼片語要求太多。它們中的任何一個都不太可能足夠安全以用作密碼。
2. 使用第二個密碼來導出密鑰安全嗎?
可能,但在所有其他員工之間共享密碼肯定是不安全的。
除此之外,在相同的輸入材料上同時使用 Argon2i 和 scrypt 只會減慢您的服務速度,而對手只需要執行最快的服務(從他們的角度來看)。
如果在驗證密碼後導出密鑰,則可以使用基於密鑰的 KDF,例如 HKDF。
3. …如果不使用新的派生密鑰重新加密所有數據,這是否可能?
不,為此,您需要一個數據鍵,正如您所描述的那樣。
如果這行得通,Halites Symmetric::encrypt 對於第二個密鑰是否足夠安全?
抱歉,這不是主題;我們不能保證加密系統或庫的安全性。你當然可以比 libsodium 做得更差來加密數據,但它是否安全還取決於系統和實現細節。