资讯专栏INFORMATION COLUMN

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

X_AirDu / 1764人阅读

摘要:的工作流程实际上就是将伪散列函数应用到输入的密码中,生成一个散列值,然后将这个散列值作为一个加密,应用到后续的加密过程中,以此类推,将这个过程重复很多次,从而增加了密码破解的难度,这个过程也被称为是密码加强。

简介

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/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/

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/121587.html

相关文章

  • Node.js 指南(轻松分析Node.js应用程序)

    摘要:要解决此问题,请对上述处理程序进行一些小修改,以使用函数的异步版本以上基准测试与你的应用程序的异步版本的一个新的运行结果好极了你的应用程序现在每秒大约提供个请求,大约是同步哈希生成的倍,此外,平均延迟从之前的秒降至仅超过秒。 轻松分析Node.js应用程序 有许多第三方工具可用于分析Node.js应用程序,但在许多情况下,最简单的选择是使用Node.js内置的分析器,内置的分析器使用V...

    HitenDev 评论0 收藏0
  • yii2加密解密那些事儿

    摘要:我们做程序的时候,加密解密是绕不开的话题,使用开发应用的时候,都内置了哪些有关加密解密安全方便的支持那本文将为你揭晓。函数声明为存在着第三个参数,比如我们可以传递会员的等,这样此信息将和一起作为加密解密的钥匙。 我们做程序的时候,加密解密是绕不开的话题,使用yii2开发应用的时候,都内置了哪些有关加密解密(安全)方便的支持那?本文将为你揭晓。 相关环境 操作系统及IDE macOS ...

    dendoink 评论0 收藏0
  • python模块hashlib

    摘要:使用算法名称构造函数较使用更快所有平台的模块都支持的算法的名称集合。的结果集总是结果集的子集对象的字节长度对象的内部块大小对象的名称传递类字节参数通常是更新对象。表示的哈希摘要算法的名称,比如或。表示迭代次数,基于算法以及机器计算能力设置。 hashlib模块实现了多种安全哈希和信息摘要算法的通用接口,包括FIPS中定义的SHA1, SHA224, SHA256, SHA384, SH...

    luodongseu 评论0 收藏0
  • Spring Security 进阶-加密

    摘要:在中加密是一个很简单却又不能忽略的模块,数据只有加密起来才更安全,这样就散算据库密码泄漏也都是密文。当然也可以自定义构造方法,来制定用其他的方案进行加密。应用先示范下使用系统的来演示下简单的注入构造加密方案 在 Spring Security 中加密是一个很简单却又不能忽略的模块,数据只有加密起来才更安全,这样就散算据库密码泄漏也都是密文。本文分析对应的版本是 5.14。 概念 Spr...

    wanglu1209 评论0 收藏0
  • 以太坊钱包开发系列2 - 账号Keystore文件导入导出

    摘要:文件如何生成的以太坊是使用对称加密算法来加密私钥生成文件,因此对称加密秘钥注意它其实也是发起交易时需要的解密秘钥的选择就非常关键,这个秘钥是使用算法推导派生而出。加密推倒的相关配置是用于加密以太坊私钥的对称加密算法。 本文首发于深入浅出区块链社区原文链接:[使用 ethers.js 开发以太坊 Web 钱包 2 - 账号 Keystore 文件导入导出)](https://learnb...

    SegmentFault 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<