尝试使用 PHP 针对现有 ASP.NET 成员身份数据库对用户进行身份验证时,我遇到了一些问题。我在网上搜索过,我发现的现有答案似乎对我不起作用。即:
public static function Hash($password, $salt)
{
$decodedSalt = base64_decode($salt);
$utf = mb_convert_encoding($password, 'UTF-16LE', 'UTF-8');
return base64_encode(sha1($decodedSalt.$utf, true));
}
我认为问题的一部分是密码哈希实际上不是用 SHA-1 计算的,因为数据库中的值是 44 个字符长、base64 编码的字符串(这意味着输入可能是 256 位长)。我尝试使用 SHA-256 代替 SHA-1,但无济于事。我在 web.config 中找不到可以进一步加盐的机器密钥,当我在本地或生产服务器上运行时,ASP.NET 站点会生成相同的哈希,所以我不知道它们为什么会这样不匹配。
Web.config 成员资格提供程序:
<add connectionStringName="MySqlMembershipConnection" enablePasswordRetrieval="false" enablePasswordReset="true" requiresQuestionAndAnswer="false" requiresUniqueEmail="true" passwordFormat="Hashed" maxInvalidPasswordAttempts="5" minRequiredPasswordLength="6" minRequiredNonalphanumericCharacters="0" passwordAttemptWindow="10" applicationName="/" autogenerateschema="true" name="MySqlMembershipProvider" type="MySql.Web.Security.MySQLMembershipProvider, mysql.web" />
应该工作的示例密码:
$salt = 'Mu1tp8XzfKl8dSTVAZm44A=='; // Straight from the DB
$password = 'testing';
$expectedHash = 'TQN7m8OWIyBOKVwzegWSUBVq7o7+KWFBc46J+B77mLw=' // Straight from the DB
// When using the above Hash function with SHA-256 instead of SHA-1
$generatedHash = 'rpmTmtBfWoJz71ooQGQUIIyQJKd99qhYxMUI1yda0qE='
想法?知道为什么我的哈希与数据库中存储的内容不匹配(以及通过 ASP.NET 站点登录时它为什么/如何工作)?我试过换掉散列函数,颠倒密码/盐连接,在敲我的电脑时大声喊叫,但这些似乎都没有帮助。