Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/296.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Python中使用scrypt为密码和salt生成哈希_Python_Password Encryption_Scrypt - Fatal编程技术网

如何在Python中使用scrypt为密码和salt生成哈希

如何在Python中使用scrypt为密码和salt生成哈希,python,password-encryption,scrypt,Python,Password Encryption,Scrypt,我想使用scrypt为我的用户的密码和密码创建一个散列。我发现了,但有些事情我不明白 它们使用scrypt加密和解密函数。一个加密一个随机字符串,另一个加密salt(这看起来是错误的,因为只有密码而不是salt用于解密)。解密函数似乎用于验证密码/salt,作为解密的副作用 基于我所了解的一点,我想要的是密钥派生函数(KDF),而不是加密/解密,并且KDF可能由scrypt生成并用于加密/解密。实际的KDF是在幕后使用的,我担心盲目地遵循这些示例会导致错误。如果使用scrypt encrypt/

我想使用scrypt为我的用户的密码和密码创建一个散列。我发现了,但有些事情我不明白

它们使用scrypt加密和解密函数。一个加密一个随机字符串,另一个加密salt(这看起来是错误的,因为只有密码而不是salt用于解密)。解密函数似乎用于验证密码/salt,作为解密的副作用


基于我所了解的一点,我想要的是密钥派生函数(KDF),而不是加密/解密,并且KDF可能由scrypt生成并用于加密/解密。实际的KDF是在幕后使用的,我担心盲目地遵循这些示例会导致错误。如果使用scrypt encrypt/decrypt函数生成和验证密码,我不理解加密字符串的作用。它的内容或长度重要吗?

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

scrypt文件实用程序执行以下操作:选择特定于您的系统的scrypt的n/r/p参数&最小时间参数。然后它生成一个32字节的salt,然后调用
scrypt(n,r,p,salt,pwd)
来创建一个64字节的密钥。工具返回的二进制字符串由以下部分组成:1)包含n、r、p值的标头,以及二进制编码的salt;2) 标头的sha256校验和;3)校验和的hmac-sha256签名副本,使用密钥的前32个字节。然后,它使用密钥的剩余32字节对输入数据进行AES加密

我可以看出这其中有几个含义:

  • 输入数据没有意义,因为它实际上并不影响正在使用的salt,并且encrypt()每次都会生成一个新的salt

  • 您不能手动配置n、r、p工作负载,也不能以任何其他方式配置工作负载,只能使用最短时间参数。这不是不安全的,而是控制工作因素的一种相当尴尬的方式

  • 在decrypt调用重新生成密钥并将其与hmac进行比较后,如果您的密码错误,它将立即拒绝所有内容-但如果密码正确,它将继续对数据包进行解密。这是攻击者不必执行的大量额外工作-他们甚至不必派生64个字节,只需检查签名所需的32个字节。这个问题并不会使它变得不安全,但做攻击者不想做的工作永远都是不可取的

  • 没有办法配置salt密钥、派生密钥大小等。当前值没有那么糟糕,但仍然不理想

  • 解密实用程序的“最大时间”限制对于密码散列来说是错误的-每次调用decrypt时,它都会估计系统的速度,并对它是否能够在最大时间内计算密钥进行一些“猜测”-这是攻击者不必做的更大开销(参见#3),但这也意味着解密可能会在系统负载过重的情况下拒绝密码

  • 我不知道为什么Colin Percival没有将kdf和参数选择代码作为公共api的一部分,但实际上它在源代码中明确标记为“private”——甚至没有导出以进行链接。这让我很犹豫,如果没有更多的研究,就直接访问它

  • 总之,我们需要的是一个可以存储scrypt的好的哈希格式,以及一个公开底层kdf和参数选择算法的实现。我目前正在为自己做这件事,但没有引起太多关注:(


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

    这两个引用都完全错了。不要乱搞
    加密
    解密
    :只需使用
    散列

    KDF没有直接暴露出来,但是
    hash
    已经足够接近了(事实上,在我看来它甚至更好,因为它混合了PBKDF2三明治的填充物。)

    可与python2.7和python3.2一起使用。它使用PyCrypto、passlib和py-scrypt,但只需要py-scrypt

    您需要使用一个连续时间比较函数,如
    passlib.utils.consteq
    ,以减轻定时攻击


    您还需要仔细选择参数。默认值logN=14,r=8,p=1表示1“轮”使用16 MiB内存。在服务器上,您可能需要10、8、8—更少的RAM,更多的CPU。您应该在预期负载下在硬件上计时。

    谢谢。我对一些解密进行了计时,即使是一个字符串,它们看起来也是高度可变和耗时的。其他问题我可以接受,但不知道值是多少为了使解密不会返回“解密文件将花费太长时间”的错误,我无法使用它。bcrypt看起来更友好,可能对我来说也没问题。