複製鏈接
請複製以下鏈接發送給好友

PBKDF2

鎖定
PBKDF2應用一個偽隨機函數以導出密鑰。導出密鑰的長度本質上是沒有限制的(但是,導出密鑰的最大有效搜索空間受限於基本偽隨機函數的結構)。
PBKDF2,PBKDF2簡單而言就是將salted hash進行多次重複計算,這個次數是可選擇的。如果計算一次所需要的時間是1微秒,那麼計算1百萬次就需要1秒鐘。假如攻擊一個密碼所需的rainbow table有1千萬條,建立所對應的rainbow table所需要的時間就是115天。這個代價足以讓大部分的攻擊者望而生畏。
美國政府機構已經將這個方法標準化,並且用於一些政府和軍方的系統。 這個方案最大的優點是標準化,實現容易同時採用了久經考驗的SHA算法。
中文名
PBKDF2
外文名
Password-Based Key Derivation Function 2
應    用
政府和軍方
優    點
標準化

目錄

PBKDF2使用説明

DK = PBKDF2(P,S,c,dkLen)
可選項: RPF 基本偽隨機函數(hLen表示偽隨機函數輸出的字節長度)
輸入:
P 口令,一字節串
S 鹽值,字節串
dkLen 導出密鑰的指定字節長度,正整數,最大約(2^32-1)*hLen
輸出: DK 導出密鑰,長度dkLen字節
步驟:
1. 如果dkLen>(2^32-1)*hLen,輸出“derived key too long”並停止。
2. 假設l是導出密鑰的hLen個字節塊的個數,r表示最後一個塊的字節數。
l = CEIL (dkLen / hLen) ,
r = dkLen - (l - 1) * hLen .
這裏,CEIL(x)是“ceiling”函數,即,大於或等於x的最小整數。
4. 對於導出密鑰的每一塊,運用函數F於口令P、鹽S、迭代次數c和塊索引以計算塊:
T_1 = F (P, S, c, 1) ,
T_2 = F (P, S, c, 2) ,
...
T_l = F (P, S, c, l) ,
這裏函數F定義為基本偽隨機函數PRF應用於口令P和鹽S的串聯和塊索引i的前c次循環的異或和。
F (P, S, c, i) = U_1 \xor U_2 \xor ... \xor U_c
其中
U_1 = PRF (P, S || INT (i)) ,
U_2 = PRF (P, U_1) ,
...
U_c = PRF (P, U_{c-1}) .
這裏,INT(i)是整數i的四字節編碼,高字節在先。
3. 串聯各塊,抽取前dkLen字節以產生導出密鑰DK:
DK = T_1 || T_2 || ... || T_l<0..r-1>
4. 輸出導出密鑰DK。
注意:函數F的構造遵循“belt-and-suspenders”方法。U_i次循環被遞歸計算以消除敵手的並行度;它們被異或到一起以減少有關遞歸退化到一個小的值集的擔憂。

PBKDF2其他算法

PBKDF2bcrypt

bcrypt是專門為密碼存儲而設計的算法,基於Blowfish加密算法變形而來,由Niels Provos和David Mazières發表於1999年的USENIX
bcrypt最大的好處是有一個參數(work factor),可用於調整計算強度,而且work factor是包括在輸出的摘要中的。隨着攻擊者計算能力的提高,使用者可以逐步增大work factor,而且不會影響已有用户的登陸。
bcrypt經過了很多安全專家的仔細分析,使用在以安全著稱的OpenBSD中,一般認為它比PBKDF2更能承受隨着計算能力加強而帶來的風險。bcrypt也有廣泛的函數庫支持,因此我們建議使用這種方式存儲密碼。

PBKDF2scrypt

scrypt是由著名的FreeBSD黑客 Colin Percival為他的備份服務 Tarsnap開發的。
數據加密 數據加密
和上述兩種方案不同,scrypt不僅計算所需時間長,而且佔用的內存也多,使得並行計算多個摘要異常困難,因此利用rainbow table進行暴力攻擊更加困難。scrypt沒有在生產環境中大規模應用,並且缺乏仔細的審察和廣泛的函數庫支持。但是,scrypt在算法層面只要沒有破綻,它的安全性應該高於PBKDF2和bcrypt。