赞
踩
PBKDF2(Password-Based Key Derivation Function) 应用一个伪随机函数以导出密钥。导出密钥的长度本质上是没有限制的(但是,导出密钥的最大有效搜索空间受限于基本伪随机函数的结构)。
它的基本原理是通过一个伪随机函数(例如 HMAC 函数),把明文和一个盐值作为输入参数,然后重复进行运算,并最终产生密钥。
如果重复的次数足够大,破解的成本就会变得很高。而盐值的添加也会增加“彩虹表”攻击的难度。
美国政府机构已经将这个方法标准化,并且用于一些政府和军方的系统。 这个方案最大的优点是标准化,实现容易同时采用了久经考验的SHA算法。
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
其中:
DK 的值由一个以上的 block 拼接而成。block 的数量是 dkLen/hLen 的值。
就是说如果 伪随机函数PRF 输出的结果比期望得到的密钥长度要短,则要通过拼接多个结果以满足密钥的长度,如下公式所示:
D
K
=
T
1
∣
∣
T
2
.
.
.
∣
∣
T
d
k
l
e
n
/
h
l
e
n
DK=T_1||T_2...||T_{dklen/hlen}
DK=T1∣∣T2...∣∣Tdklen/hlen
其中,每个 block 则通过则通过函数F得到:
T
i
=
F
(
P
a
s
s
w
o
r
d
,
S
a
l
t
,
c
,
i
)
T_i = F(Password, Salt, c, i)
Ti=F(Password,Salt,c,i)
函数 F 里,PRF会进行 c 次的运算,然后把得到的结果进行异或运算
⨁
\bigoplus
⨁,得到最终的值
F
(
P
a
s
s
w
o
r
d
,
S
a
l
t
,
c
,
i
)
=
U
1
⨁
U
2
⨁
.
.
.
⨁
U
c
F(Password, Salt, c, i) = U_1\bigoplus U_2 \bigoplus ... \bigoplus U_c
F(Password,Salt,c,i)=U1⨁U2⨁...⨁Uc
注意:
第一次,PRF 会使用 Password 作为 key,Salt 拼接
∣
∣
||
∣∣上编码成大字节序的 32 位整型的i作为盐值进行运算,即:
U
1
=
P
R
F
(
P
a
s
s
w
o
r
d
,
S
a
l
t
∣
∣
I
N
T
_
32
_
B
E
(
i
)
)
U_1 = PRF(Password, Salt || INT\_32\_BE(i))
U1=PRF(Password,Salt∣∣INT_32_BE(i))
而后续的 c-1 次则会使用上次得到的结果作为盐值,即:
U
2
=
P
R
F
(
P
a
s
s
w
o
r
d
,
U
1
)
⋯
U
c
=
P
R
F
(
P
a
s
s
w
o
r
d
,
U
c
−
1
)
U_2 = PRF(Password, U_1) \\ \cdots \\ U_c = PRF(Password, U_{c-1})
U2=PRF(Password,U1)⋯Uc=PRF(Password,Uc−1)
PBKDF2算法的产生是随着用户密码加密的不断发展而得来,因此,想要了解PBKDF2算法的产生背景,我们需要了解用户密码加密的发展历史。用户密码加密的方法演变如下:
工具试用:PBKDF2加密
https://blog.csdn.net/xy010902100449/article/details/52078767
https://blog.csdn.net/wowotuo/article/details/77150796
https://baike.baidu.com/item/PBKDF2/237696?fr=aladdin
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。