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哈希?
通过查看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,即使他们正在做同样的事情.
| 归档时间: |
|
| 查看次数: |
55 次 |
| 最近记录: |