将密码身份验证从ASP迁移到PHP

时间:2011-09-15 08:12:43

标签: php asp.net drupal

我在将一个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中重现它以便我可以跨用户进行迁移?

提前致谢!

2 个答案:

答案 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);
}