在PHP函数中重现Authlogic Hash

时间:2011-12-30 03:13:58

标签: php ruby-on-rails ruby passwords authlogic

鉴于我知道哈希密码,盐和&使用Authlogic生成的原始密码(ruby on rails gem)。

PHP是否可以设计一个函数来检查用户密码是否与数据库中的用户Ruby Authlogic hashed_pw相匹配?我需要将现有的PHP应用程序与ruby应用程序集成,而无需重置所有Ruby用户密码。

我尝试了类似下面的内容,但似乎无法正常工作

function passwordhash($password, $salt)
{
 return hash('sha512', "{$password}:{$salt}");
}
echo passwordhash("orange","NsxUt51YVzK4dFeVJOj");
output: 7b4a69291354dc3591e490f47f29d5a4a4b6d7faa23d01a1ee595b917526b65e2dda48e978c46b81dde0269adc3f853a36c075d236eb89c8f6b21811fe3da1bb

数据库信息

crypted_password 
f777c545bf9844faaa5f3b129e77e4199539793d907e397ddc97d1bb747a30d402201bd11ed9ca0eaecbf3b9652b314aa919d65904c64d4169ce0e1ac1c526a4

password_salt
NsxUt51YVzK4dFeVJOj

real password
orange

似乎这应该是可能的,我错过了什么?

谢谢, 莱恩

2 个答案:

答案 0 :(得分:2)

我对authlogic代码的细读提示了两件事:

  • 它不使用:将密码与salt分开(即要消化的第一个字符串是orangeNsxUt51YVzK4dFeVJOj
  • 它在第一个进程的输出上执行sha512摘要,并重复此过程20次

另一件事是authlogic支持大量的散列策略 - 确保你试图重新实现正确的散列策略!当然看起来20折sha512是正确的。

链接:https://github.com/binarylogic/authlogic/blob/master/lib/authlogic/crypto_providers/sha512.rb

答案 1 :(得分:0)

我设法重现了ruby gem authlogic sha512实现,如下所示:

  /**
   * implements ruby gem authlogic sha512 encryption
   * @param $password
   * @param $salt
   * @return string
   */
  private function sha512hash($password, $salt) {
    $strechtes = 20;
    $digest = $password . $salt;
    for ($i = 0; $i < $strechtes; $i++) {
      $digest = hash('sha512', $digest);
    }
    return $digest;
  }