如何在Python中使用scrypt为密码和salt生成哈希
我想使用scrypt为我的用户的密码和密码创建一个散列。我发现了,但有些事情我不明白 它们使用scrypt加密和解密函数。一个加密一个随机字符串,另一个加密salt(这看起来是错误的,因为只有密码而不是salt用于解密)。解密函数似乎用于验证密码/salt,作为解密的副作用如何在Python中使用scrypt为密码和salt生成哈希,python,password-encryption,scrypt,Python,Password Encryption,Scrypt,我想使用scrypt为我的用户的密码和密码创建一个散列。我发现了,但有些事情我不明白 它们使用scrypt加密和解密函数。一个加密一个随机字符串,另一个加密salt(这看起来是错误的,因为只有密码而不是salt用于解密)。解密函数似乎用于验证密码/salt,作为解密的副作用 基于我所了解的一点,我想要的是密钥派生函数(KDF),而不是加密/解密,并且KDF可能由scrypt生成并用于加密/解密。实际的KDF是在幕后使用的,我担心盲目地遵循这些示例会导致错误。如果使用scrypt encrypt/
基于我所了解的一点,我想要的是密钥派生函数(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加密
我可以看出这其中有几个含义:
不过,最重要的是,这些网站的说明是“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看起来更友好,可能对我来说也没问题。