簡述PBKDF2算法

在互聯(lián)網(wǎng)存儲用戶密碼時(shí),為了安全起見,不能采用明文儲存的方式,而需要對其進(jìn)行Hash,得到Hash值后進(jìn)行保存。但這種方法很容易受到彩虹表攻擊,于是便出現(xiàn)了Hash+salt(哈希+鹽值)的操作。今天我們就來了解一種重復(fù)多次Hash+salt操作的算法——PBKDF2算法。

PBKDF2算法簡介

PBKDF2(Password-Based Key Derivation Function 2)是應(yīng)用一個(gè)偽隨機(jī)函數(shù)以導(dǎo)出密鑰,導(dǎo)出密鑰的長度本質(zhì)上是沒有限制的,但導(dǎo)出密鑰的最大有效搜索空間受限于基本偽隨機(jī)函數(shù)的結(jié)構(gòu)。

PBKDF2的原來是通過一個(gè)偽隨機(jī)函數(shù),把明文和一個(gè)鹽值作為輸入?yún)?shù),然后重復(fù)進(jìn)行運(yùn)算,并最終產(chǎn)生密鑰。

簡單來說,就是在Hash算法基礎(chǔ)上增加隨機(jī)鹽,并進(jìn)行多次Hash運(yùn)算,隨機(jī)鹽使得彩虹表的建表難度大幅增加,而多次Hash也使得建表和破解的難度都大幅增加。

PBKDF2

PBKDF2算法過程

首先,我們先來了解一個(gè)函數(shù),DK=PBKDF2(PRF, Password, Salt, c, dkLen)。其中:

  1. DK是PBKDF2算法產(chǎn)生的密鑰
  2. PRF是一個(gè)偽隨機(jī)函數(shù),例如HASH_HMAC函數(shù),它會輸出長度為hLen的結(jié)果
  3. Password 是用來生成密鑰的原文密碼
  4. Salt 是一系列用于生成密鑰加密的鹽值
  5. c是迭代運(yùn)算的次數(shù)
  6. dkLen 是期望得到的密鑰的長度

PBKDF2

DK的值由一個(gè)以上的block拼接而成。block的數(shù)量是dkLen/hLen的值。

就是說如果偽隨機(jī)函數(shù)PRF輸出的結(jié)果比期望得到的密鑰長度要短,則要通過拼接多個(gè)結(jié)果以滿足密鑰的長度,如下公式所示:DK=T1||T2...||Tdklen/hlen

其中,每個(gè)block則通過則通過函數(shù)F得到:Ti=F(Password,Salt,c,i)

函數(shù)F里,PRF會進(jìn)行 c 次的運(yùn)算,然后把得到的結(jié)果進(jìn)行異或運(yùn)算?,得到最終的值F(Password,Salt,c,i)=U1?U2?...?Uc

其中,第一次PRF會使用Password作為key,Salt 拼接||上編碼成大字節(jié)序的 32 位整型的i作為鹽值進(jìn)行運(yùn)算,即:U1=PRF(Password,Salt||INT_32_BE(i))

而后續(xù)的c-1次則會使用上次得到的結(jié)果作為鹽值,即:U2=PRF(Password,U1)?Uc=PRF(Password,Uc?1)

PBKDF2算法的安全性

使用PBKDF2算法時(shí),Hash算法一般選用sha1或者sha256,隨機(jī)鹽的長度一般不能少于8字節(jié),Hash次數(shù)至少也要1000次,這樣安全性才足夠高。一次密碼驗(yàn)證過程進(jìn)行1000次Hash運(yùn)算,對服務(wù)器來說可能只需要1ms,但對于破解者來說計(jì)算成本增加了1000倍,而至少8字節(jié)隨機(jī)鹽,更是把建表難度提升了N個(gè)數(shù)量級,使得大批量的破解密碼幾乎不可行,該算法也是美國國家標(biāo)準(zhǔn)與技術(shù)研究院推薦使用的算法。

免責(zé)聲明:素材源于網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系刪稿。