密碼學系列之:1Password的加密基礎PBKDF2

flydean發表於2021-10-04

簡介

1password是一個非常優秀的密碼管理軟體,有了它你可以輕鬆對你的密碼進行管理,從而不用再考慮密碼洩露的問題,據1password官方介紹,它的底層使用的是PBKDF2演算法對密碼進行加密。

那麼PBKDF2是何方神聖呢?它有什麼優點可以讓1password得以青睞呢?一起來看看吧。

PBKDF2和PBKDF1

PBKDF的全稱是Password-Based Key Derivation Function,簡單的說,PBKDF就是一個密碼衍生的工具。既然有PBKDF2那麼就肯定有PBKDF1,那麼他們兩個的區別是什麼呢?

PBKDF2是PKCS系列的標準之一,具體來說他是PKCS#5的2.0版本,同樣被作為RFC 2898釋出。它是PBKDF1的替代品,為什麼會替代PBKDF1呢?那是因為PBKDF1只能生成160bits長度的key,在計算機效能快速發展的今天,已經不能夠滿足我們的加密需要了。所以被PBKDF2替換了。

在2017年釋出的RFC 8018(PKCS #5 v2.1)中,是建議是用PBKDF2作為密碼hashing的標準。

PBKDF2和PBKDF1主要是用來防止密碼暴力破解的,所以在設計中加入了對算力的自動調整,從而抵禦暴力破解的可能性。

PBKDF2的工作流程

PBKDF2實際上就是將偽雜湊函式PRF(pseudorandom function)應用到輸入的密碼、salt中,生成一個雜湊值,然後將這個雜湊值作為一個加密key,應用到後續的加密過程中,以此類推,將這個過程重複很多次,從而增加了密碼破解的難度,這個過程也被稱為是密碼加強。

我們看一個標準的PBKDF2工作的流程圖:

從圖中可以看到,初始的密碼跟salt經過PRF的操作生成了一個key,然後這個key作為下一次加密的輸入和密碼再次經過PRF操作,生成了後續的key,這樣重複很多次,生成的key再做異或操作,生成了最終的T,然後把這些最終生成的T合併,生成最終的密碼。

根據2000年的建議,一般來說這個遍歷次數要達到1000次以上,才算是安全的。當然這個次數也會隨著CPU計算能力的加強發生變化。這個次數可以根據安全性的要求自行調整。

有了遍歷之後,為什麼還需要加上salt呢?加上salt是為了防止對密碼進行彩虹表攻擊。也就是說攻擊者不能預選計算好特定密碼的hash值,因為不能提前預測,所以安全性得以提高。標準salt的長度推薦是64bits,美國國家標準與技術研究所推薦的salt長度是128 bits。

詳解PBKDF2的key生成流程

上面一小節,我們以一種通俗易懂的方式告訴大家,PBKDF2到底是怎麼工作的。一般來說,瞭解到這一層也就夠了,但是如果你想更加深入,瞭解PBKDF2的key生成的底層原理,那麼還請關注這一小節。

我們上面介紹了PBKDF2是一個生成衍生key的函式,作為一個函式,那麼就有輸入和輸出,我們先看下PBKDF2的定義:

DK = PBKDF2(PRF, Password, Salt, c, dkLen)

PBKDF2有5個函式,我們看下各個引數代表什麼意思:

  • PRF 是一個偽隨機雜湊函式,我們可以根據需要對其進行替換,比如替換成為HMAC函式。
  • Password 是主密碼用來生成衍生key。
  • Salt是一個bits序列,用來對密碼加鹽。
  • c 是迴圈的次數。
  • dkLen 是生成的key要求的bits長度。
  • DK是最後生成的衍生key。

在上一節中,我們可以看到其實最後的衍生key是由好幾部分組成的,上圖中的每一個T都代表著衍生key的一部分,最後將這些T合併起來就得到了最終的衍生key,其公式如下:

DK = T1 + T2 + ⋯ + Tdklen/hlen
Ti = F(Password, Salt, c, i)

上面的F是c次遍歷的異或鏈。其公式如下:

F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc

其中:

U1 = PRF(Password, Salt + INT_32_BE(i))
U2 = PRF(Password, U1)
⋮
Uc = PRF(Password, Uc−1)

HMAC密碼碰撞

如果PBKDF2的PRF使用的是HMAC的話,那麼將會傳送一些很有意思的問題。對於HMAC來說,如果密碼的長度大於HMAC可以接受的範圍,那麼該密碼會首先被做一次hash運算,然後hash過後的字串會被作為HMAC的輸入。

我們舉個例子,如果使用者輸入的密碼是:

    Password: plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd

經過一次HMAC-SHA1運算之後,得到:

    SHA1 (hex): 65426b585154667542717027635463617226672a

將其轉換成為字串得到:

    SHA1 (ASCII): eBkXQTfuBqp'cTcar&g*

所以說,如果使用PBKDF2-HMAC-SHA1的加密方式的話,下面兩個密碼生成衍生key是一樣的。

    "plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd"
    "eBkXQTfuBqp'cTcar&g*"

PBKDF2的缺點

雖然PBKDF2可以通過調節迴圈遍歷的次數來提高密碼破解的難度。但是可以為其研製特殊的處理器,只需要很少的RAM就可以對其進行破解。為此bcrypt 和 scrypt 等依賴於大量RAM的加密演算法,這樣就導致那些廉價的ASIC處理器無用武之地。

總結

以上就是PBKDF2的簡單介紹,想要詳細瞭解更多的朋友,可以參考我的其他關於密碼學的文章。

本文已收錄於 http://www.flydean.com/41-pbkdf2/

最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!

歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!

相關文章