无法在Ruby-s和Go-s实现之间创建相同的scrypt摘要

Jar*_*man 3 ruby go scrypt libsodium nacl-cryptography

我在计算RbNaCl和Go的实现之间的相同scrypt摘要时遇到了问题.

这是我用rbnacl生成密钥的方式:

opslimit = 2**20
memlimit = 2**24
digest_size = 32

digest = RbNaCl::PasswordHash.scrypt(
        password,
        salt,
        opslimit,
        memlimit,
        digest_size
)
Run Code Online (Sandbox Code Playgroud)

已从文档中找到opslimit和memlimit参数值.

这是我尝试用Go复制相同的结果:

N := 32768
r := 8
p := 1
keyLength := 32

secretKeyBytes, _ := scrypt.Key(password, salt, N, r, p, keyLength)
Run Code Online (Sandbox Code Playgroud)

对值Ñ,- [R ,p和keyLength从得到的文档.

password和salt具有相同的值.

我不是密码学家,但据我所知,应该有相同的成本因素值来获得相同的摘要?这里的问题是,由于两种实现都采用不同的参数计数,因此我也很难找到正确的组合.任何想法如何使这两个实现之间的成本因素匹配,以便我可以计算两种编程语言之间相同的scrypt哈希?

Jar*_*man 5

通过查看libsodium的函数pickparams来管理从opslimit和memlimit计算N,p和r,这是由crypto_pwhash_scryptsalsa208sha256调用的,而后者又被RbNaCl的Ruby scrypt实现调用.

以下是将opslimit和memlimit转换为适当的N,p和r以供其他scrypt实现使用的相关代码,如果其他人在将来需要它,它将为scrypt提供更低级别的API:https: //gist.github.com/亚尔莫/ 22f871076ff70e39b54e69c6305c020f

只需在main中更改opslimit和memlimit变量值,然后使用gcc编译它并运行它以获取N,r和p的值.

总而言之,问题是Go暴露了比RbNaCl更低级别的API,即使他们正在做同样的事情.