您现在的位置是:网站首页>文章详情文章详情

Python实现CryptoJS.PBKDF2摘要算法

inlike2022-07-26 原创文章 浏览(1725) 评论(0) 喜欢(5)

简介在Python中实现JavaScript中常用的CryptoJS.PBKDF2摘要算法。

什么是PBKDF2算法

PBKDF2对输入密码密码短语以及盐值应用伪随机函数,例如基于散列的消息验证码(HMAC),并多次重复该过程以生成派生密钥,然后可将其用作加密密钥在后续的操作中。增加的计算工作使密码破解变得更加困难,并且被称为密钥拉伸

当标准在 2000 年编写时,建议的最小迭代次数为 1,000,但该参数旨在随着 CPU 速度的提高而随着时间的推移而增加。2005 年的 Kerberos 标准建议进行 4,096 次迭代;据报道,Apple 为 iOS 3 使用了 2,000 个,为 iOS 4 使用了 10,000 个;而 LastPass 在 2011 年对 JavaScript 客户端使用了 5,000 次迭代,对服务器端哈希使用了 100,000 次迭代。2021 年,OWASP 建议对 PBKDF2-HMAC-SHA256 使用 310,000 次迭代,对 PBKDF2-HMAC-SHA512 使用 120,000 次迭代。

基于密码的密钥推导函数2的迭代过程的算法表示。

在密码中添加盐会降低使用预先计算的哈希(彩虹表)进行攻击的能力,这意味着必须单独测试多个密码,而不是一次测试。该标准建议盐长度至少为 64 位。美国国家标准与技术研究院推荐的盐长度为 128 位。

JavaScript中的使用


var salt = CryptoJS.lib.WordArray.random(128 / 8);
var secretPassPhrase = CryptoJS.lib.WordArray.random(128 / 8);
var key128Bits = CryptoJS.PBKDF2(secretPassPhrase.toString(), salt, { keySize: 128 / 32 });

如果当你在网页中发现了这样的代码,那就是使用了PBKDF2算法,该算法的两个重要参数密码和盐,一般来说salt是WordArray类型,如果直接复制他的16进制字符串,那么需要处理一下 才能在Python中使用。

import binascii
binascii.unhexlify(salt)  # 将16进制字符串转为bytes类型

在Python中实现了同样算法的库是pycryptodomex,使用前需安装该库,使用方法如下:

from Cryptodome.Protocol.KDF import PBKDF2  # pycryptodomex


result = PBKDF2(secretPassPhrase, binascii.unhexlify(salt), count=100)
result = binascii.hexlify(result)  # byte转16进制字符串

其中count参数是计算的次数,salt是直接从JavaScript中复制的16进制的字符串,需要转化为bytes之后再使用,secretPassPhrase是要计算的密码。


3b87e950352ac65c7832ab9afbf2b21193138a20.jpg

很赞哦! ( 5)
    《Python实战进阶》
    None
    None
    夏至已深

站点信息

  • 建站时间:2019-5-24
  • 网站程序:like in love
  • 主题模板《今夕何夕》
  • 文章统计:104条
  • 文章评论:***条
  • 微信公众号:扫描二维码,关注我们
  • 个人微信公众号