使用PHP对ASP.NET成员身份的用户进行身份验证

Ste*_*her 4 php c# asp.net .net-4.0

尝试使用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));
}
Run Code Online (Sandbox Code Playgroud)

我认为问题的部分原因在于密码散列实际上不是使用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" />
Run Code Online (Sandbox Code Playgroud)

例如密码工作:

$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='
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?知道为什么我的哈希值与数据库中存储的哈希值不匹配(以及为什么/如何在通过ASP.NET网站登录时起作用)吗?我尝试换出哈希函数,反转密码/盐的串联,并在打我的计算机时大声喊叫,但这些似乎都没有帮助。

sil*_*ire 5

我看了您链接到的身份验证问题页面,并得到了一个特殊的答案:https : //stackoverflow.com/a/4227642/633098

因为您说过使用的算法不再是SHA1,而是很有可能是SHA256,所以我开始尝试使用HMAC哈希SHA256。最初它没有用,但是后来我尝试了同时使用由密码和salt组成的串联字符串以及salt(= key)本身,并且成功了。

这是我做的简单函数:

function _hash($password, $salt) {
    return base64_encode(hash_hmac('sha256', base64_decode($salt) . iconv('UTF-8', 'UTF-16LE', $password), base64_decode($salt), true));
}

$salt = 'Mu1tp8XzfKl8dSTVAZm44A=='; // Straight from the DB
$password = 'testing';

var_dump(_hash($password, $salt));
Run Code Online (Sandbox Code Playgroud)

结果哈希:TQN7m8OWIyBOKVwzegWSUBVq7o7 + KWFBc46J + B77mLw =