我在计算 RbNaCl 之间的相同 scrypt 摘要时遇到问题和 Go's implementation .
下面是我如何使用 rbnacl 生成 key :
opslimit = 2**20
memlimit = 2**24
digest_size = 32
digest = RbNaCl::PasswordHash.scrypt(
password,
salt,
opslimit,
memlimit,
digest_size
)
opslimit 和 memlimit 参数值已从 documentation 中找到.
这是我用 Go 复制相同结果的尝试:
N := 32768
r := 8
p := 1
keyLength := 32
secretKeyBytes, _ := scrypt.Key(password, salt, N, r, p, keyLength)
N、r、p 和 keyLength 的值来自 documentation .
password 和 salt 具有相同的值。
我不是密码学家,但据我所知应该有相同的成本因子值才能获得相同的摘要?这里的问题是,由于两种实现都采用不同数量的参数,因此我也很难找到正确的组合。有什么想法可以使成本因素在这两种实现之间匹配,以便我可以在两种编程语言之间计算相同的 scrypt 哈希值吗?
最佳答案
设法根据opslimit 和memlimit 计算N、p 和r通过查看 libsodium 的函数 pickparams ,它被 crypto_pwhash_scryptsalsa208sha256 调用,它又被 Ruby 在 RbNaCl 的 scrypt 实现调用。
这是将opslimit 和memlimit 转换为适当的N、p 和r 的相关代码 供其他 scrypt 实现使用,如果将来有人需要它,它会为 scrypt 提供较低级别的 API: https://gist.github.com/jarmo/22f871076ff70e39b54e69c6305c020f
只需更改 main 中的 opslimit 和 memlimit 变量值,然后用 gcc 编译它并运行它以获取 N< 的值/em>、r 和 p。
总的来说,问题在于 Go 公开了比 RbNaCl 更低级别的 API,即使它们在做同样的事情。
关于ruby - 无法在 Ruby-s 和 Go-s 实现之间创建相同的 scrypt 摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46876925/