0

我正在尝试使用默认的 asp.net 表和提供程序将用户从 Joomla 数据库迁移到自定义数据库。从理论上讲,我可以通过更改 web.config 将哈希类型从默认 (SHA) 更改为 MD5,但是,当登录时它会报告无效的密码(或用户名,但我怀疑是这样)。检查 aspnet_Membership 表和 Joomla_users 表我可以看到每个用户都有相同的密码和盐值(Joomla 1.7 实际上将它存储为密码:盐,但这很容易分成两个字段)。两者似乎都是 base64 格式,并且通过 ASP 默认登录控件添加用户会为新用户生成一对类似的字段(尽管我认为 salt 是随机的,所以我无法与相同的已知密码进行比较)。

这是我的 web.config 的摘录:

<system.web>
  <machineKey validation="MD5"/>
  ...
<membership hashAlgorithmType="MD5">
  <providers>
    <clear />
    <add name="AspNetSqlMembershipProvider"
         type="System.Web.Security.SqlMembershipProvider"
         connectionStringName="UserAuth"
         enablePasswordRetrieval="false"
         enablePasswordReset="true"
         requiresQuestionAndAnswer="false"
         requiresUniqueEmail="false"
         maxInvalidPasswordAttempts="5"
         minRequiredPasswordLength="6"
         minRequiredNonalphanumericCharacters="0"
         passwordAttemptWindow="10"
         passwordFormat="Hashed"
         applicationName="/" />
  </providers>
</membership>
</system.web>

我不确定的一件事是它是 md5、Md5 还是 MD5(我在谷歌搜索时在代码示例中看到了后者)。但是,我可以写废话,并且该应用程序似乎不会眨眼。

除非没有其他方法,否则我并不特别希望编写自定义会员提供程序。

下面是一些 PHP,它将 Joomla 散列密码与作为参数提供给此函数的密码进行比较:

                $user_id = mysql_result($result, 0, 'id');
                $db_password = mysql_result($result, 0, 'password');
                $joomla = &New JConfig;
                list($md5pass, $saltpass) = split(":", $db_password);
                $md5_password = md5($user_password.$saltpass);
                if (strcmp($md5_password, $suppliedpass) == 0)
                {
                    return $user_id;
                }

要么 ASP 版本忽略了我的 md5 请求,要么它以某种其他方式存储它,或者我没有告诉它正确使用 md5,或者......?我不想告诉 4000 个用户重置他们的密码,尽管我知道这些天不推荐使用 md5。

4

1 回答 1

0

我想我解决了。在 Joomla 中,从 PHP 代码中,md5 应用于 pass+salt。在 SqlMembershipProvider.cs 中,它应用于 salt+pass。

SqlMembershipProvider.cs 是通过 SQLMembershipProvider 找到的- 源代码- 也许不是真正的来源,但我认为没有理由在该特定方面与真正的来源不同。

于 2013-05-19T20:56:31.797 回答