Hash

這個客戶端密碼雜湊方案安全嗎?

  • September 28, 2015

我想建構一個使用客戶端加密在伺服器上儲存加密數據的應用程序。將使用使用者特定的主密鑰,以便在設備之間輕鬆共享它,它的加密版本將儲存在伺服器上。

使用者的密碼將用於 1) 加密主密鑰和 2) 驗證使用者。因此,伺服器必須不知道密碼。

密碼片語將被使用兩次,用於使用 PBKDF2、HMAC-SHA256 和大量迭代進行拉伸:

  1. 首先,將導出用於加密主密鑰的加密密鑰。此處將使用隨機鹽(也使用加密密鑰儲存在伺服器上)。
  2. 其次,將導出密碼的散列版本。使用者電子郵件將是鹽。

然後將擴展密碼(#2)而不是普通密碼發送到伺服器。然後,伺服器將使用 bcrypt 進一步保護該散列並驗證使用者。

假設所有通信都通過 HTTPS 進行,並且使用者被迫選擇一個強密碼,我認為這沒有什麼問題。我錯了嗎?

假設一個人類可以記住的密碼片語,這遠非安全。您需要注意的主要事情是可以對密碼進行離線暴力攻擊。這是因為伺服器可以猜出密碼並按照相同的程序查看解密是否有效。可以購買一台每秒計算數十億次雜湊的機器(幾千美元)。很少有密碼足夠強大來抵抗這種攻擊。

如果您不能做任何比使用密碼加密更好的事情,那麼至少它是一些東西。但我不會相信這樣的解決方案(不是我能記住的密碼)。我建議找到一種不同的方法來為客戶端傳播密鑰,而不是將其儲存在伺服器上。(我知道這將不太有用,但安全成本……)

我認為這個想法很好——這幾乎就是 Lastpass 所做的(見下文)。但就像與密碼學有關的任何事情一樣,每個細節都很重要。如果您使用電子郵件作為客戶端鹽,那麼首先通過 PBKDF2 執行電子郵件以確保足夠的熵似乎是個好主意。

encryption_key = PBKDF2(HMAC-SHA256, password, client-salt, rounds) // decrypts your data
auth_key = sha256(encryption_key) // this is what is sent to the server for authentication
server_hash = PBKDF2(HMAC-SHA256, auth_key, server-salt, 100000) // stored in the authentication database

儲存在身份驗證數據庫中的密碼的完整算法:

PBKDF2(HMAC-SHA256, sha256(PBKDF2(HMAC-SHA256, password, client-salt, rounds)), server-salt, 100000)

儘管有人猜測在某些情況下執行雙 HMAC 即 HMAC(HMAC(..)..) 時可能存在漏洞,但在實際使用大量 PBKDF 輪次時,我懷疑這將是一個問題。IMO 加上大量的伺服器輪次,這種身份驗證方案是堅如磐石的。

編輯 2015 年 7 月 2 日

這部分是為了評論 Yehuda Lindell 上面的回答(我還不能添加評論),並提出了 PBKDF2 用法的替代建議:

  • 一種選擇是同時依賴客戶端和使用者。PBKDF2 接受密碼和鹽。代替原始海報建議的電子郵件,在客戶端隨機生成鹽將確保客戶端組件。不幸的是,這會將您鎖定到特定的客戶。
  • 建立更強密碼的指導方針。xkcd的另一個建議。

話雖如此,Yehuda 並不是唯一一個朝著無密碼體驗邁進的人——看看FIDO 聯盟所做的出色工作。

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