【问题标题】:Ruby on Rails passing a salt to Digest::SHA512Ruby on Rails 将盐传递给 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)

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

【问题讨论】:

    标签: ruby-on-rails-3.1 digest-authentication sha512


    【解决方案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 代码中的盐是空的,因此存在差异。但是现在这两种方法返回的结果是一样的。

      【讨论】:

        猜你喜欢
        • 2012-06-26
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-21
        • 2012-09-17
        • 1970-01-01
        相关资源
        最近更新 更多