Ruby on Rails 将盐传递给 Digest::SHA512

Posted

技术标签:

【中文标题】Ruby on Rails 将盐传递给 Digest::SHA512【英文标题】:Ruby on Rails passing a salt to Digest::SHA512 【发布时间】:2012-02-27 10:45:24 【问题描述】:

Rails 中的等价物是什么(php):

 hash_hmac('sha512', $password . $salt, $siteSalt);

我已经做到了:

Digest::SHA512.hexdigest(password + salt)

但是不知道如何将站点盐纳入方程式,我看到的所有在线示例都没有将盐传递给 hexdigest 方法。当我尝试过它时,我得到一个参数太多的错误。

还有这个带有冒号的符号(我在某处看到的):

salted = password + salt
Digest::SHA512.hexdigest("#salted:site_salt")

不会产生相同的哈希值。

谢谢

编辑 我偶然发现了这个看起来更接近我需要的东西(对不起,我对整个散列很陌生):

OpenSSL::HMAC.hexdigest('sha512', site_salt, salted)

但它仍然会产生与存储在数据库中的哈希值不同的哈希值。

【问题讨论】:

【参考方案1】:

我使用的是 Rails 4,而 @brian 的 rails 代码没有为我编译。

这对我有用。

Rails 外壳:

2.1.2 :001 > Digest::HMAC.hexdigest("password"+"salt","siteSalt",Digest::SHA512)
 => "15b45385a00b10eb25c3aa8198d747862575a796a89a6c79b5a0b8ea332a8d75b1ec0dc1f0c9f7930d30c9359279e86df29067bbbc5d9bcf87839f855ac7a677"

PHP(从命令行)

 $ php -r 'print hash_hmac("sha512", "password" . "salt", "siteSalt") . "\n";'
15b45385a00b10eb25c3aa8198d747862575a796a89a6c79b5a0b8ea332a8d75b1ec0dc1f0c9f7930d30c9359279e86df29067bbbc5d9bcf87839f855ac7a677

【讨论】:

【参考方案2】:

我认为这会做你想要的:

HMAC::SHA512.hexdigest(site_salt, password + salt)

看起来您引用的 PHP 代码使用 siteSalt 作为 HMAC 函数的键,并将密码和盐连接指定为要散列的值。

我通过在 PHP 中运行此代码检查了这一点:

% php -r 'print hash_hmac("sha512", "password" . "salt", "siteSalt") . "\n";'
15b45385a00b10eb25c3aa8198d747862575a796a89a6c79b5a0b8ea332a8d75b1ec0dc1f0c9f7930d30c9359279e86df29067bbbc5d9bcf87839f855ac7a677

然后在 Rails shell 中:

>> HMAC::SHA512.hexdigest('siteSalt', 'password' + 'salt')
=> "15b45385a00b10eb25c3aa8198d747862575a796a89a6c79b5a0b8ea332a8d75b1ec0dc1f0c9f7930d30c9359279e86df29067bbbc5d9bcf87839f855ac7a677"

【讨论】:

是的,这几乎就是我在最后一种方法中所拥有的。原来 PHP 代码中的盐是空的,因此存在差异。非常感谢您的回答。 Rails 代码没有为我编译(3 年后使用 Rails 4 并不奇怪)。因此,对于任何发现此问题的人,请参阅下面的答案。【参考方案3】:

事实证明 PHP 代码中的盐是空的,因此存在差异。但是现在这两种方法返回的结果是一样的。

【讨论】:

以上是关于Ruby on Rails 将盐传递给 Digest::SHA512的主要内容,如果未能解决你的问题,请参考以下文章

在 ruby​​ on rails 中将参数从视图传递到控制器

如何使用 Ruby on Rails 将数据从控制器传递到模型?

通过javascript在ruby on rails中传递项目ID值

在 Ruby on Rails 4 中使用 Active Record 或 Squeel Gem 重写 SQL 查询

如何在 Rails 视图中将 Ruby 变量传递给 JavaScript 函数?

从 ruby​​ on rails 重定向到 angular 给 preflight 的响应是无效错误