写点什么

密码学系列之:1Password 的加密基础 PBKDF2

发布于: 刚刚

简介 1password 是一个非常优秀的密码管理软件,有了它你可以轻松对你的密码进行管理,从而不用再考虑密码泄露的问题,据 1password 官方介绍,它的底层使用的是 PBKDF2 算法对密码进行加密。


那么 PBKDF2 是何方神圣呢?它有什么优点可以让 1password 得以青睐呢?一起来看看吧。


PBKDF2 和 PBKDF1PBKDF 的全称是 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/hlenTi = 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/


最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧等你来发现!


欢迎关注我的公众号:「程序那些事」,懂技术,更懂你!

发布于: 刚刚阅读数: 2
用户头像

关注公众号:程序那些事,更多精彩等着你! 2020.06.07 加入

最通俗的解读,最深刻的干货,最简洁的教程,众多你不知道的小技巧,尽在公众号:程序那些事!

评论

发布
暂无评论
密码学系列之:1Password的加密基础PBKDF2