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

标签 ruby go libsodium scrypt nacl-cryptography

我在计算 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
)

opslimitmemlimit 参数值已从 documentation 中找到.

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

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

secretKeyBytes, _ := scrypt.Key(password, salt, N, r, p, keyLength)

NrpkeyLength 的值来自 documentation .

passwordsalt 具有相同的值。

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

最佳答案

设法根据opslimitmemlimit 计算Npr通过查看 libsodium 的函数 pickparams ,它被 crypto_pwhash_scryptsalsa208sha256 调用,它又被 Ruby 在 RbNaCl 的 scrypt 实现调用。

这是将opslimitmemlimit 转换为适当的Npr 的相关代码 供其他 scrypt 实现使用,如果将来有人需要它,它会为 scrypt 提供较低级别的 API: https://gist.github.com/jarmo/22f871076ff70e39b54e69c6305c020f

只需更改 main 中的 opslimitmemlimit 变量值,然后用 gcc 编译它并运行它以获取 N< 的值/em>、rp

总的来说,问题在于 Go 公开了比 RbNaCl 更低级别的 API,即使它们在做同样的事情。

关于ruby - 无法在 Ruby-s 和 Go-s 实现之间创建相同的 scrypt 摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46876925/

相关文章:

javascript - libsodium 兼容性 PHP 与 Javascript

ruby - 有没有更简单的方法来编写以下 cucumber 测试?

ruby-on-rails - GWT 和 Ruby on Rails

ruby - 修剪尾随 .0

去游览#18。如何将整数传递给 Pic?

go - 连接超时访问外部IP google compute engine

typescript - 找不到模块 `libsodium-wrappers`

ruby - 使用自定义命名空间解析 Ruby 中的 ATOM

docker - 如何在 Dockerfile 中使用 ENTRYPOINT 执行 Docker 容器

c# - 如何在 ASP.NET 上包含 libsodium.net