為什麼 LastPass 以這種方式使用 PBKDF2 對他們的密碼進行雜湊處理?
LastPass 是一個密碼管理器,我相信你們中的許多人都熟悉它。我一直在研究 LastPass 的原始碼。從他們的常見問題解答以及我可以從他們的原始碼中收集到的內容,他們派生和儲存您的加密密鑰的方式如下:
客戶端應用程序使用標準 PBKDF2 和您的主密碼、可變次數的迭代(預設為 5000,但您可以設置任何您喜歡的值)以及您的電子郵件地址作為 salt 來派生您的加密密鑰。
生成的加密密鑰用於加密和解密您的保管庫資訊。
為了與他們的伺服器進行身份驗證,他們然後使用該加密密鑰並再次使用 PBKDF2 對其進行雜湊處理,這一次使用先前生成的加密密鑰作為密碼輸入,並將使用者的主密碼作為鹽。這只需 1 次迭代即可完成。
然後將生成的雜湊傳輸到 LastPass 伺服器,在那裡(根據他們的常見問題解答,因為我看不到他們的伺服器原始碼)他們再次使用標準 PBKDF2 和隨機鹽和 100,000 次迭代。
虛擬碼
pbkdf2(algorithm, password, salt, iterations, bytes)
客戶
enc_key = pbkdf2(sha256, master_password, email, client_iterations, 32) key_hash = pbkdf2(sha256, enc_key, master_password, 1, 32)
伺服器
stored_hash = pbkdf2(sha256, key_hash, random_bits, 100000, 32)
問題
我對他們正在做的關鍵雜湊過程感到困惑。看來他們正在使用 PBKDF2 作為一種計算 SHA256 雜湊的方法,以在傳輸到他們的伺服器期間保護它。
- 你能解釋一下在上面使用 1 次迭代的 PBKDF2 做了什麼嗎?
- 這與僅執行 HMAC SHA256 雜湊之類的操作相同嗎?
- 是否有任何問題,例如受感染的伺服器接收此雜湊並能夠從中獲取有關原始加密密鑰或主密碼的任何資訊(在計算儲存的雜湊之前)?
你能解釋一下在上面使用 1 次迭代的 PBKDF2 做了什麼嗎?
這與僅執行 HMAC SHA256 雜湊之類的操作相同嗎?
這主要是 HMAC-SHA256,但您可以聲明您想要多少位派生密鑰。我認為以這種方式使用它是為了易於實現(與以復雜方式排列的許多原語相比,擁有一個 PBKDF2 的工作實現更容易)。
是否有任何問題,例如受感染的伺服器接收此雜湊並能夠從中獲取有關原始加密密鑰或主密碼的任何資訊(在計算儲存的雜湊之前)?
不,這幾乎是不可能的,因為只要 SHA256 是一種方式。SHA256 不太可能以這種方式被破壞(MD5 和 SHA-1 只有碰撞攻擊)。如果有的話,如果密碼被更改,這將洩漏,因為在發送到伺服器之前沒有添加隨機部分,這是設計缺陷(除非他們做了額外的事情,你省略了)。
此外,正如 SEJPM 所注意到的,在使用者設備上只進行了 5k 次迭代,而在他們的伺服器上進行了 100k 次迭代,這很奇怪。這將使伺服器處於更好的位置來執行蠻力攻擊。但是,對於大多數電腦而言,客戶端上的 5k 次迭代似乎非常低,並且可能無論如何都應該進行調整。