我想使用scrypt为我的用户的密码和盐创建一个哈希。我已经找到two references,但是有些事情我不了解。

他们使用scrypt加密和解密功能。一种加密随机字符串,另一种加密salt(这看起来是错误的,因为只有密码而不是salt用于解密)。看起来好像使用了解密功能来验证密码/盐,这是解密的副作用。

根据我的了解,我想要的是 key 派生函数(KDF)而不是加密/解密,并且scrypt可能会生成并使用KDF进行加密/解密。实际的KDF在后台使用,我担心盲目地遵循这些示例会导致错误。如果使用scrypt加密/解密功能来生成和验证密码,则我不了解所加密字符串的作用。它的内容或长度重要吗?

最佳答案

您是正确的-这两个链接正在使用的scrypt函数是scrypt文件加密实用程序,而不是基础kdf。我一直在缓慢地为python创建基于scrypt的独立密码哈希,然后自己遇到了这个问题。

scrypt文件实用程序执行以下操作:选择特定于系统的scrypt的n/r/p参数和“min time”参数。然后,它生成一个32字节的盐,然后调用scrypt(n,r,p,salt,pwd)创建一个64字节的 key 。工具返回的二进制字符串包括:1)包含n,r,p值的 header ,以及以二进制编码的盐。 2)头的sha256校验和;和3)使用 key 的前32个字节的校验和的hmac-sha256签名副本。然后,它使用 key 的其余32个字节对​​输入数据进行AES加密。

我可以看到以下几点含义:

  • ,输入数据毫无意义,因为它实际上不会影响所使用的盐,并且crypto()每次都会生成一个新的盐。
  • 您无法手动配置n,r,p工作负荷,但笨拙的最小时间参数除外。这不是不安全的方法,但是它是控制工作因子的一种相当尴尬的方法。
  • 解密调用重新生成 key 并将其与hmac比较之后,
  • 会在您的密码错误的情况下拒绝那里的所有内容-如果正确,它将继续解密数据包。攻击者无需执行很多额外的工作-他们甚至不必派生64个字节,仅需要32个字节即可检查签名。这个问题并不能使其变得完全不安全,但是永远不要让攻击者工作。
  • 无法配置盐键,派生键大小等。当前值虽然还不错,但是仍然不理想。
  • 对于密码哈希,解密实用程序的“最大时间”限制是错误的-每次调用解密时,它都会估计您的系统速度,并对是否可以在最大时间内计算 key 进行一些“猜测”-这会增加您的开销攻击者不必这样做(请参阅#3),但是这也意味着解密可以在沉重的系统负载下开始拒绝密码。
  • 我不确定为什么Colin Percival没有将kdf和参数选择代码作为公共(public)api的一部分,但是实际上它在源代码中被明确标记为“私有(private)”-甚至没有导出用于链接。这让我犹豫着直接访问它,而无需进行更多研究。

  • 总而言之,所需要的是一种可以存储scrypt的不错的哈希格式,以及一个公开基础kdf和参数选择算法的实现。我目前正在passlib上为此工作,但并没有引起太多关注:(

    不过,最重要的是-这些网站的说明“正常”,我只将一个空字符串用作文件内容,并要注意额外的开销和问题。

    关于python - 如何使用scrypt在Python中为密码和盐生成哈希,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13654492/

    10-08 22:40