密码存储与传输的那些事儿(三)PBKDF2密码哈希

     上篇介绍了BCrypt密码哈希算法,这次来看一下与之齐名的PBKDF2算法,首先看一下其基本公式:

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

    DK表示哈希计算结果,其中PBKDF2的参数包含如下5个:

  • PRF:这个可以理解为HMAC算法,HMAC在此就不过多介绍了,可理解为就是利用摘要算法对秘钥以及固定消息进行摘要计算,这里秘钥就是指的Password,而固定消息会根据上一轮的计算结果进行迭代。HMAC需要指定摘要算法,如MD5、SHA1、SHA256、SHA512等。
  • Password:待哈希密码
  • Salt:盐,根据官方建议,此盐长度最好不要小于16字节,会用作初次HMAC计算的固定消息值的一部分。
  • c:可以理解为迭代次数
  • dkLen:即为最后哈希结果的字节长度

       总的来说其原理还是较好理解的,具体算法的话也就不在此介绍了,简单来说就是不停的进行HMAC计算迭代。接下来同上篇一样,来看一下实际的代码以及耗时计算,以javascript库crypto-js为例,其入参与之前公式类似,指示PRF参数调整到了最后一个,示例设置为“sha512”,如下所示:

const crypto = require('crypto');
const secret = '12345678';
const salt = 'abcdefghijklmnop';

var timestamp=new Date().getTime();
const result = crypto.pbkdf2Sync(secret, salt, 100000, 64, 'sha512');
console.log(new Date().getTime() - timestamp);
console.log(result.toString('hex'));

     最后可得出,10万次迭代的耗时为150ms左右,当达到18万次时,会接近300ms,为此如我之前所描述,为了不影响用户体验同时保证密码安全,尽量控制在300ms以下,为此取值应在100000-180000。


       根据PBKDF2维基的描述,在安全性方面可理解为:PBKDF2<bcrytp<scrypt,为此后续将进一步研究scrypt密码哈希算法。此外,根据之前举行的密码哈希算法比赛的结果,Argon2是最后的赢家,为此后续也会抽空学习一下该算法。

发布了42 篇原创文章 · 获赞 9 · 访问量 6万+

猜你喜欢

转载自blog.csdn.net/jjxojm/article/details/81843295
今日推荐