我想用scrypt创建我的用户的密码和盐的哈希。 我已经找到2个 引用 ,但有件事情我不理解他们。
他们使用scrypt加密和解密功能。 一个加密一个随机字符串和其他加密盐(看起来错误的,因为只有口令,而不是盐用于解密)。 它看起来像被用来验证密码/盐作为解密的副作用的解密函数。
基于小我明白了,我要的是一个密钥导出函数(KDF),而不是加密/解密,而且KDF很可能产生和scrypt加密/解密使用。 实际KDF使用幕后,我很担心,盲目跟随这些例子会导致一个错误。 如果scrypt加密/解密功能是用于生成和验证密码,我不明白字符串的作用被加密。 是否其内容或长度有关系吗?
你是正确的 - 在scrypt功能这两个环节都玩是scrypt文件加密工具,而不是基本的KDF。 我一直在慢慢地致力于创造蟒蛇独立的基于scrypt密码哈希,跑进这个问题我自己。
该scrypt文件实用程序执行以下操作:精选scrypt的N / R / P参数特定于系统和“最小时间”参数。 然后,它产生一个32字节的盐,然后调用scrypt(n,r,p,salt,pwd)
来创建一个64个字节密钥。 二进制串的工具返回的组成如下:1)含有N,R,P值,并以二进制编码的盐的头部; 2)报头的SHA256校验; 和3)HMAC-SHA256签名校验的拷贝,使用前32个字节的关键。 在此之后,它使用剩余的32个字节的关键AES加密的输入数据。
有一对夫妇的这种影响,我可以看到的:
该输入数据是没有意义的,因为它实际上并不影响所使用的盐,和加密()生成新的盐各一次。
你不能配置N,R,P手工工作量,或其他任何方式,但尴尬的最小时间参数。 这是不是不安全的,但是要控制工作因素比较尴尬的方式。
解密通话再生的关键,并确定它的HMAC之后,它会拒绝一切在那里,如果你的密码是错误的-但如果它是正确的,它会继续还解密数据包。 这是一个很多额外的工作,攻击者就不必执行 - 他们甚至没有导出64个字节,只需要32来检查签名。 这个问题并不能使它不安全准确,但这样做你的工作,攻击者没有永远可取。
有没有办法来配置盐键,导出密钥大小等的当前值也不差,不过,它的效果并不理想。
解密实用程序的“最大时间”的限制是错误的密码哈希-每次解密被调用时,它估计您的系统的速度,并做了一些“猜测”至于是否可以计算出最大时间内的关键-这是更多的开销你的攻击没有做(见#3),但它也意味着解密可以开始系统负载过重下拒绝密码。
我不知道为什么科林·珀西瓦尔并没有使KDF和公共API的参数选择代码的一部分,但它INFACT明确标记为“私人”的源代码里-即使没有出口的连接。 这使我犹豫,只是访问它直没有很多更多的研究。
总而言之,我们需要的是能够scrypt存储一个不错的哈希格式,并露出下面的KDF和参数选择算法的实现。 我目前正在对这个自己的passlib ,但目前还没有看到太多的注意:(
只是虽然底线的事情-那些网站的说明是“OK”,我只是用一个空字符串作为文件的内容,并意识到的额外开销和问题。
这两个参考了它完全错误的。 不要用渣土encrypt
和decrypt
:只使用hash
该KDF是不直接暴露,但hash
足够接近。 (事实上,在我看来是更好,因为它混合了PBKDF2三明治的馅。)
此示例代码可工作在python2.7和python3.2。 它采用PyCrypto,passlib和PY-scrypt,而只需要 PY-scrypt。
您将要使用contstant时间比较函数一样passlib.utils.consteq
减轻计时攻击。
您还需要仔细选择的参数。 缺省值= logN个14,R = 8,P = 1意味着1 “轮” 的使用存储器16中的MIB。 在服务器上,你可能想要的东西更像是10,8,8 - 较少的内存,更多的CPU。 你要定时它在你的硬件上预期负载下。