简介
1password 是一个十分优良的明码管理软件,有了它你能够轻松对你的明码进行治理,从而不必再思考明码泄露的问题,据 1password 官网介绍,它的底层应用的是 PBKDF2 算法对明码进行加密。
那么 PBKDF2 是何方神圣呢?它有什么长处能够让 1password 得以青眼呢?一起来看看吧。
PBKDF2 和 PBKDF1
PBKDF 的全称是 Password-Based Key Derivation Function,简略的说,PBKDF 就是一个明码衍生的工具。既然有 PBKDF2 那么就必定有 PBKDF1,那么他们两个的区别是什么呢?
PBKDF2 是 PKCS 系列的规范之一,具体来说他是 PKCS#5 的 2.0 版本,同样被作为 RFC 2898 公布。它是 PBKDF1 的替代品,为什么会代替 PBKDF1 呢?那是因为 PBKDF1 只能生成 160bits 长度的 key,在计算机性能疾速倒退的明天,曾经不可能满足咱们的加密须要了。所以被 PBKDF2 替换了。
在 2017 年公布的 RFC 8018(PKCS #5 v2.1)中,是倡议是用 PBKDF2 作为明码 hashing 的规范。
PBKDF2 和 PBKDF1 次要是用来避免明码暴力破解的,所以在设计中退出了对算力的主动调整,从而抵挡暴力破解的可能性。
PBKDF2 的工作流程
PBKDF2 实际上就是将伪散列函数 PRF(pseudorandom function)利用到输出的明码、salt 中,生成一个散列值,而后将这个散列值作为一个加密 key,利用到后续的加密过程中,以此类推,将这个过程反复很屡次,从而减少了明码破解的难度,这个过程也被称为是明码增强。
咱们看一个规范的 PBKDF2 工作的流程图:
从图中能够看到,初始的明码跟 salt 通过 PRF 的操作生成了一个 key,而后这个 key 作为下一次加密的输出和明码再次通过 PRF 操作,生成了后续的 key,这样反复很屡次,生成的 key 再做异或操作,生成了最终的 T,而后把这些最终生成的 T 合并,生成最终的明码。
依据 2000 年的倡议,一般来说这个遍历次数要达到 1000 次以上,才算是平安的。当然这个次数也会随着 CPU 计算能力的增强发生变化。这个次数能够依据安全性的要求自行调整。
有了遍历之后,为什么还须要加上 salt 呢?加上 salt 是为了避免对明码进行彩虹表攻打。也就是说攻击者不能预选计算好特定明码的 hash 值,因为不能提前预测,所以安全性得以进步。规范 salt 的长度举荐是 64bits,美国国家标准与技术研究所举荐的 salt 长度是 128 bits。
详解 PBKDF2 的 key 生成流程
下面一大节,咱们以一种通俗易懂的形式通知大家,PBKDF2 到底是怎么工作的。一般来说,理解到这一层也就够了,然而如果你想更加深刻,理解 PBKDF2 的 key 生成的底层原理,那么还请关注这一大节。
咱们下面介绍了 PBKDF2 是一个生成衍生 key 的函数,作为一个函数,那么就有输出和输入,咱们先看下 PBKDF2 的定义:
DK = PBKDF2(PRF, Password, Salt, c, dkLen)
PBKDF2 有 5 个函数,咱们看下各个参数代表什么意思:
- PRF 是一个伪随机散列函数,咱们能够依据须要对其进行替换,比方替换成为 HMAC 函数。
- Password 是主明码用来生成衍生 key。
- Salt 是一个 bits 序列,用来对明码加盐。
- c 是循环的次数。
- dkLen 是生成的 key 要求的 bits 长度。
- DK 是最初生成的衍生 key。
在上一节中,咱们能够看到其实最初的衍生 key 是由好几局部组成的,上图中的每一个 T 都代表着衍生 key 的一部分,最初将这些 T 合并起来就失去了最终的衍生 key,其公式如下:
DK = T1 + T2 + ⋯ + Tdklen/hlen
Ti = F(Password, Salt, c, i)
下面的 F 是 c 次遍历的异或链。其公式如下:
F(Password, Salt, c, i) = U1 ^ U2 ^ ⋯ ^ Uc
其中:
U1 = PRF(Password, Salt + INT_32_BE(i))
U2 = PRF(Password, U1)
⋮
Uc = PRF(Password, Uc−1)
HMAC 明码碰撞
如果 PBKDF2 的 PRF 应用的是 HMAC 的话,那么将会发送一些很有意思的问题。对于 HMAC 来说,如果明码的长度大于 HMAC 能够承受的范畴,那么该明码会首先被做一次 hash 运算,而后 hash 过后的字符串会被作为 HMAC 的输出。
咱们举个例子,如果用户输出的明码是:
Password: plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd
通过一次 HMAC-SHA1 运算之后,失去:
SHA1 (hex): 65426b585154667542717027635463617226672a
将其转换成为字符串失去:
SHA1 (ASCII): eBkXQTfuBqp'cTcar&g*
所以说,如果应用 PBKDF2-HMAC-SHA1 的加密形式的话,上面两个明码生成衍生 key 是一样的。
"plnlrtfpijpuhqylxbgqiiyipieyxvfsavzgxbbcfusqkozwpngsyejqlmjsytrmd"
"eBkXQTfuBqp'cTcar&g*"
PBKDF2 的毛病
尽管 PBKDF2 能够通过调节循环遍历的次数来进步明码破解的难度。然而能够为其研制非凡的处理器,只须要很少的 RAM 就能够对其进行破解。为此 bcrypt 和 scrypt 等依赖于大量 RAM 的加密算法,这样就导致那些便宜的 ASIC 处理器无用武之地。
总结
以上就是 PBKDF2 的简略介绍,想要具体理解更多的敌人,能够参考我的其余对于密码学的文章。
本文已收录于 http://www.flydean.com/41-pbkdf2/
最艰深的解读,最粗浅的干货,最简洁的教程,泛滥你不晓得的小技巧等你来发现!
欢送关注我的公众号:「程序那些事」, 懂技术,更懂你!