我想使用 scrypt 为用户的密码和盐创建哈希。我找到了两个参考资料,但有些地方我不明白。
他们使用scrypt加密和解密功能。一个加密随机字符串,另一个加密盐(这看起来是错误的,因为只有密码而不是盐用于解密)。看起来解密功能用于验证密码/盐作为解密的副作用。
根据我对的了解,我想要的是一个密钥派生函数(KDF)而不是加密/解密,并且KDF很可能是由scrypt生成并使用的加密/解密。实际的KDF是在幕后使用的,我担心盲目遵循这些示例会导致错误。如果使用 scrypt 加密/解密函数来生成和验证密码,我不明白被加密字符串的作用。它的内容或长度重要吗?
这两个参考资料都完全错了。不要使用加密
和解密
:只需使用哈希
KDF 没有直接公开,但哈希
足够接近。(事实上,在我看来它甚至更好,因为它混合了PBKDF2三明治的馅料。
此示例代码适用于 python2.7 和 python3.2。它使用PyCrypto,passlib和py-scrypt,但只需要py-scrypt。
您可能希望使用一个像< code > passlib . utils . consteq 这样的常量时间比较函数来减少计时攻击。
您还需要仔细选择参数。缺省值logN=14,r=8,p=1表示使用16 MiB内存的1轮。在服务器上,您可能想要更少的内存,更多的CPU。您应该在您的硬件上根据您的预期负载来计时。
你是对的 - 这两个链接正在使用的 scrypt 函数是 scrypt 文件加密实用程序,而不是底层 kdf。我一直在慢慢地为python创建一个独立的基于scrypt的密码哈希,我自己也遇到了这个问题。
scrypt文件实用程序执行以下操作:选择特定于系统的scrypt的n/r/p参数
我认为这有几个潜在的影响:
>
输入数据没有意义,因为它实际上不会影响正在使用的salt,并且encrypt()每次都会生成一个新的salt。
除了笨拙的最小时间参数之外,您不能手动配置n、r、p工作负载或任何其他方式。这不是不安全,而是控制工作因子的一种相当笨拙的方式。
在解密调用重新生成密钥并将其与hmac进行比较之后,如果您的密码错误,它将拒绝那里的所有内容&但如果正确,它将继续解密数据包。这是攻击者不必执行的大量额外工作-他们甚至不必导出64个字节,只需要32个字节来检查签名。这个问题并不会让它变得不安全,但做攻击者不需要的工作是永远不可取的。
没有办法配置盐键、派生键大小等,当前值还不错,但仍然不理想。
解密实用程序的“最大时间”限制对于密码哈希是错误的 - 每次调用 Decrypt 时,它都会估计系统的速度,并“猜测”它是否可以在最大时间内计算密钥 - 这是攻击者不必做的更多开销(参见 #3),但这也意味着解密可能会在沉重的系统负载下开始拒绝密码。
我不确定为什么科林·珀西瓦尔没有制作 kdf
总而言之,需要的是一个可以存储scrypt的漂亮哈希格式,以及一个公开底层kdf和参数选择算法的实现。我目前正在为passlib自己研究这个,但它没有得到太多关注:(
只是为了底线的事情 - 这些站点的说明是“好的”,我只会使用一个空字符串作为文件内容,并注意额外的开销和问题。
我四处看看,最接近的答案是:如何生成随机的字母数字字符串? 我想根据本CrackStation教程遵循此工作流: 存储密码 > 使用CSPRNG生成长随机盐。 在密码前添加salt,并使用标准加密哈希函数(如SHA256)对其进行哈希运算。 在用户的数据库记录中保存salt和哈希。 验证密码的步骤 > 从数据库中检索用户的盐和哈希。 将salt前置到给定密码,并使用相同的哈希函数对其进行哈希运算。
本文向大家介绍C#使用 Salt + Hash 来为密码加密,包括了C#使用 Salt + Hash 来为密码加密的使用技巧和注意事项,需要的朋友参考一下 (一) 为什么要用哈希函数来加密密码 如果你需要保存密码(比如网站用户的密码),你要考虑如何保护这些密码数据,象下面那样直接将密码写入数据库中是极不安全的,因为任何可以打开数据库的人,都将可以直接看到这些密码。 解决的办法是将密码加密后再存储进
问题内容: 在Java中以至少32个字节长的String形式生成SALT值的最佳方法是什么? 问题答案:
在Java中,将SALT值生成为至少32字节长的字符串的最佳方法是什么?
尽管我有点困惑,我是否应该将salt输入到我的PBKDF2函数中,并将salt存储在一列中,而将PBKDF2的密码存储在另一列中。 我也在使用CodeIgniter,并找到了一个用于PBKDF2的库(https://github.com/hashemqolami/codeigniter-pbkdf2-library),它声称我不需要单独存储salt。 使用作为推荐的用户密码注册用户;无需单独存储用
我想得到的是 使用libnail加密密码salt 我有一个列表的盐,我想用它来加密/解密我的密码。当我加密密码时,我得到一个哈希返回,这样一个似乎可以工作,但在解密时,我总是得到假返回值。 我是否使用了错误的方法对libnaude进行加密/解密,还是完全朝着错误的方向行驶? 我的加密/解密源: 我感谢任何帮助! 多姆