2014-03-26 98 views
2

我想将密码哈希算法从PHP转换为Javascript与Node.JS一起使用。尽管对于每个版本的代码,我的结果都不同。我想我已经正确地转换了它,但也许我错过了一些东西。PHP密码哈希算法结果与Javascript结果不同

测试密码是:Cake99

  • PHP结果:

    2392893c9280d10e82fcef37be0e94df

  • JavaScript的结果:

    73a75e6c999d773460748e269ec324c4

PHP版本

function pCrypt($password) 
{ 
    $md5password = 'superSecretMD5Pass'; 
    $s = md5($password) . md5($md5password); 
    $j = 0; 
    for ($i = 0; $i < strlen($s); $i++) 
    { 
     if ($j >= strlen($md5password)) $j = 0; 
     $s[$i] = $s[$i]^$md5password[$j]; 
     $j++; 
    } 
    return md5($s); 
} 

JavaScript版本

function pCrypt(password) { 
    var md5password = 'superSecretMD5Pass'; 
    var s = md5(password) + md5(md5password); 
    var j = 0; 
    for (i = 0; i < s.length; i++) { 
     if (j >= md5password.length) { 
      j = 0; 
     } 
     s[i] = s[i]^md5password[j]; 
     j++; 
    } 
    return md5(s); 
} 
+0

这看起来像你应该用包维护者文件中的错误。 – SomeKittens

+2

为什么你会使用哈希方法呢?!?!? http://codahale.com/how-to-safely-store-a-password/ – Petah

+0

@ SomeKittensUx2666,纯MD5结果没有问题。我不认为这是包装。 – Andrew

回答

2

http://codahale.com/how-to-safely-store-a-password/

function pCrypt(password) { 
    var md5password = 'superSecretMD5Pass'; 
    var s = md5(password) + md5(md5password); 
    var r = ''; 
    var j = 0; 
    for (i = 0; i < s.length; i++) { 
     if (j >= md5password.length) { 
      j = 0; 
     } 
     r += String.fromCharCode(s.charCodeAt(i)^md5password.charCodeAt(j)); 
     j++; 
    } 
    return md5(r); 
} 
+0

非常感谢!我其实还有另一个我也需要帮助。同样的情况,虽然现在我有更好的工作,而不是感谢这个解决方案。我可以为你付出时间。发邮件给我[email protected]。谢谢! – Andrew

4

JavaScript不支持位操作使用字符串:

> "a"^"c" 
0 
+0

啊,好的,谢谢!你能建议一种替代或某种转换吗? – Andrew

+0

@Andrew你可能想看看['String.fromCharCode'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/fromCharCode)和'String.charCodeAt '。 – TimWolla

+0

@Andrew但使用适当的密码散列算法,如bcrypt更好。 – TimWolla

1

PHP循环遍历字节,而JavaScript版本遍历每个2字节宽的UTF-16/UCS-2代码单元。