无法在Ruby-s和Go-s实现之间创建相同的scrypt摘要
我在和之间计算相同的scrypt摘要时遇到问题 以下是我如何使用rbnacl生成密钥:无法在Ruby-s和Go-s实现之间创建相同的scrypt摘要,ruby,go,libsodium,scrypt,nacl-cryptography,Ruby,Go,Libsodium,Scrypt,Nacl Cryptography,我在和之间计算相同的scrypt摘要时遇到问题 以下是我如何使用rbnacl生成密钥: opslimit = 2**20 memlimit = 2**24 digest_size = 32 digest = RbNaCl::PasswordHash.scrypt( password, salt, opslimit, memlimit, digest_size ) 已从中找到opslimit和memlimit参数值
opslimit = 2**20
memlimit = 2**24
digest_size = 32
digest = RbNaCl::PasswordHash.scrypt(
password,
salt,
opslimit,
memlimit,
digest_size
)
已从中找到opslimit和memlimit参数值
以下是我尝试用Go复制相同结果的尝试:
N := 32768
r := 8
p := 1
keyLength := 32
secretKeyBytes, _ := scrypt.Key(password, salt, N, r, p, keyLength)
N、r、p和keyLength的值从中获取
密码和salt具有相同的值
我不是密码学家,但据我所知,应该有相同的成本因素值来获得相同的摘要?这里的问题是,由于两种实现采用不同的参数计数,我也很难找到正确的组合。有没有办法让这两种实现之间的成本因素相匹配,这样我就可以在两种编程语言之间计算相同的scrypt哈希?通过查看LibNade的函数(crypto_pHash_scryptsalsa208sha256调用)来从opslimit和memlimit计算N、p和r,而Ruby在RbNaCl的scrypt实现又调用了它
以下是将opslimit和memlimit转换为适当的N、p和r以供其他scrypt实现使用的相关代码,这些实现为scrypt提供了较低级别的API(如果将来有人需要):
只需在main中更改opslimit和memlimit变量值,并用gcc编译它,然后运行它以获得N、r和p的值
总的来说,问题在于Go公开的API级别比RbNaCl低,尽管他们做的是相同的事情