簡(jiǎn)述PBKDF2算法

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

PBKDF2算法簡(jiǎn)介

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

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

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

PBKDF2

PBKDF2算法過(guò)程

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

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

PBKDF2

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

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

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

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

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

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

PBKDF2算法的安全性

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

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