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 查询