你是对的 - 这两个链接正在使用的scrypt函数是scrypt文件加密工具,而不是基础kdf。我一直在努力为python创建一个独立的基于scrypt的密码哈希,并且自己也遇到了这个问题。
scrypt文件实用程序执行以下操作:选择特定于系统的scrypt的n/r/p参数&“min time”参数。然后它生成一个32字节的盐,然后调用scrypt(n,r,p,salt,pwd)
来创建一个64字节的密钥。该工具返回的二进制字符串由以下内容组成:1)包含n,r,p值和用二进制编码的盐的头; 2)头部的sha256校验和;和3)使用密钥的前32个字节的校验和的hmac-sha256签名副本。接下来,它使用密钥的其余32个字节来对输入数据进行AES加密。
有一对夫妇的这种影响,我可以看到的:
输入的数据是没有意义的,因为它实际上并不影响盐被使用,以及加密()产生新的盐每一次。
您不能手动配置n,r,p工作负载,也不能以其他任何方式配置难以理解的最小时间参数。这并不是不安全的,但是控制工作因素是一种相当尴尬的方式。解密通话再生的关键,并确定它的HMAC
之后,它会拒绝一切在那里,如果你的密码是错误的 - 但如果它是正确的,它会继续也解密数据包。这是攻击者无需执行的大量额外工作 - 它们甚至不需要派生64个字节,只需要32个字节来检查签名。这个问题并不是完全不确定,但做你的攻击者的工作并不是永远不可取的。
有没有办法配置salt key,派生的密钥大小等等,当前值并没有那么差,但仍然不理想。
解密实用程序的“最大时间”限制对于密码散列是错误的 - 每次调用解密时,它都会估计您的系统速度,并在最大时间内做出一些“猜测”,以确定它是否可以计算密钥 - 是更多您的攻击者不必做的开销(请参阅#3),但这也意味着解密可能会在系统负载过重时开始拒绝密码。
我不知道为什么科林珀西瓦尔没有使公共API的KDF &参数选择代码的一部分,但它INFACT明确标记为“私人”的源代码里 - 甚至没有出口的连接。这使我犹豫不决,无需进行更多的研究就直接访问它。
总而言之,我们需要的是能够scrypt存储一个不错的哈希格式,并露出下面的KDF和参数选择算法的实现。我目前正在为passlib自己做这个工作,但它并没有看到太多的关注:(
只是为了底线的事情 - 虽然这些网站的说明是'好',我只是使用一个空字符串作为该文件的内容,并意识到的额外开销和问题
谢谢。我对一些解密进行了计时,即使对于一个字符串,它们看起来也是高度可变和耗时的。我可以忍受的其他问题,但不知道要放置什么值,以便解密不会返回“解密文件将需要太长的时间 ”的错误使它对我无法使用。 bcrypt看起来更友好,对我来说可能会很好。 – Mitch