【问题标题】:Migrating password auth from ASP to PHP将密码验证从 ASP 迁移到 PHP
【发布时间】:2011-09-15 08:12:43
【问题描述】:

我在将 ASP 网站的用户帐户迁移到 Drupal 时遇到了一些问题。

ASP 站点通过 HashEncode(Password+Salt) 创建密码哈希

我正在尝试找出 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 中重现它以便在用户之间迁移?

提前致谢!

【问题讨论】:

    标签: php asp.net drupal


    【解决方案1】:

    它通常是一个 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);
    

    【讨论】:

      【解决方案2】:

      正如您所链接的论坛上已经提到的,请尝试查找 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);
      }
      

      【讨论】:

      • 我在 mac 上开发,没有 ASP,所以我不能轻易查看源代码。欢呼
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2018-08-18
      • 2012-10-31
      • 2012-04-10
      • 1970-01-01
      • 2020-01-14
      • 2016-07-04
      相关资源
      最近更新 更多