Authentication

無需解密密碼即可進行身份驗證?

  • January 26, 2019

據我所知,它的工作原理是這樣的:

  1. 伺服器通過安全和加密的通道接收使用者名密碼值。
  2. 使用者名-密碼值在伺服器中解密並以明文形式顯示。
  3. 使用使用者名,為使用者檢索相應的鹽。
  4. 鹽被附加到明文密碼並最終被散列。
  5. 雜湊值與儲存的雜湊值進行比較,取決於雜湊值是否匹配,使用者是否登錄或接收到某種消息,說明使用者名/密碼錯誤。

假設問題:例如,如果我們有一個惡毒的程序員“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(您描述的典型身份驗證方法)。

引用自:https://crypto.stackexchange.com/questions/66776