Authentication
無需解密密碼即可進行身份驗證?
據我所知,它的工作原理是這樣的:
- 伺服器通過安全和加密的通道接收使用者名密碼值。
- 使用者名-密碼值在伺服器中解密並以明文形式顯示。
- 使用使用者名,為使用者檢索相應的鹽。
- 鹽被附加到明文密碼並最終被散列。
- 雜湊值與儲存的雜湊值進行比較,取決於雜湊值是否匹配,使用者是否登錄或接收到某種消息,說明使用者名/密碼錯誤。
假設問題:例如,如果我們有一個惡毒的程序員“Mallory”作為公司的程序員,他可以在身份驗證過程中編寫一段程式碼來接收明文密碼:
private bool Authentication(string username, string password) { // Some code ... log($"{username}, {password}"); // Logs the plaintext username & password for Mallory // Some more code ... }
對於這個例子,我們假設公司完全信任 Mallory,並且沒有其他人檢查過原始碼。
我的問題是:
- 是否可以以某種方式更改此身份驗證機制,以使密碼永遠不會以明文形式出現?
- 是否可以在不改變使用者努力的情況下防止這種情況發生,例如引入雙因素身份驗證或類似的東西?
這可以通過稱為密碼驗證密鑰交換(PAKE) 的加密協議來完成。它有幾種口味:
- Plain PAKE 非常適合點對點連接。兩個參與者都知道密碼,並將其用作 PAKE 協議的輸入。如果他們都同意密碼,那麼他們就會建立一個共享的密鑰,以防止竊聽。如果密碼不一致,則無法建立密鑰。
- 非對稱 PAKE (aPAKE) 非常適合客戶端-伺服器連接。客戶端清楚地知道密碼,而伺服器只保存密碼的“散列”。(實際上,它不完全是雜湊,而是涉及更多內容。關鍵是伺服器不知道明文密碼。)只有當連接的客戶端使用正確的密碼時,兩個參與者才會建立共享密鑰。
本月早些時候,在真實世界加密研討會上,Hugo Krawczyk 的演講中可以找到對最新技術的一個很好的、易於理解的介紹。在您可以使用 PAKE 執行的其他操作中,他明確談到 aPAKE 可以替代 password-over-TLS(您描述的典型身份驗證方法)。