我在将一个ASP站点的用户帐户迁移到Drupal时遇到了一些问题。
ASP站点通过HashEncode(密码+盐)
创建密码哈希我试图找出哪个是php中的等效函数,所以我可以在我们的drupal密码模块中匹配它。
有人在http://forums.overclockers.com.au/showthread.php?t=632736&page=2做了不错的尝试,但它没有用。
我听说HashEncode是sha1,但我不认为是这种情况。在另一个网站上,它显示两个不输出相同,我已经确认我的本地的PHP部分。
HashEncode("ABCD") = A11D4F0A70B882D58494B188DA0430CF4F17CFA8
sha1('ABCD') = fb2f85c88567f3c8ce9b799c7c54642d0c7b41f6
有谁知道ASP HashEncode如何工作以及如何在php中重现它以便我可以跨用户进行迁移?
提前致谢!
答案 0 :(得分:0)
它通常是HMACSHA1哈希,但诀窍是确保其utf16编码。下面是一个javascript实现。
function str2rstr_utf16le(input) {
var output = [],
i = 0,
l = input.length;
for (; l > i; ++i) {
output[i] = String.fromCharCode(
input.charCodeAt(i) & 0xFF,
(input.charCodeAt(i) >>> 8) & 0xFF
);
}
return output.join('');
}
//utf 16 encoding is important
var pwd = str2rstr_utf16le("test");
var hash = CryptoJS.HmacSHA1(pwd, pwd);
var encodedPassword = CryptoJS.enc.Base64.stringify(hash);
alert(encodedPassword);
答案 1 :(得分:-1)
正如您已经链接的论坛上所提到的,尝试找到HashEncode函数的源代码,看看究竟发生了什么。 也许ASP正在使用SHA2,它可以有多个密钥长度(例如SHA256 / SHA512)。
但您可以同时删除所有密码,因此您的用户需要在新软件上重新创建密码。这样,所有密码都将使用PHP的函数生成。
使用SHA256 + salt的示例:
/**
* generate salted password
* @param string $plainTextPassword
* @param string $salt default = NULL (create new salt)
* @param int $saltLength default = 9
* @return string password-hash
*/
function passwordHash($plainTextPassword, $salt = null, $saltLength = 9)
{
if(is_null($salt))
{
// create new salt
$salt = substr(sha1(uniqid(mt_rand(), true)), 0, $saltLength);
}
else
{
$salt = substr($salt, 0, $saltLength);
}
return $salt . hash('sha256', $salt . $plainTextPassword);
}