使用PHP对ASP.NET成员资格中的用户进行身份validation

尝试使用PHP对现有ASP.NET成员资格数据库进行身份validation时,我遇到了一些问题。 我搜索过网络,我发现的现有答案似乎对我不起作用。 即:

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成员资格提供程序:

  

应该起作用的示例密码:

 $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站点登录时原因和方式如何)? 我已经尝试更换哈希函数,反转密码/盐连接,并在敲击我的计算机时大声喊叫,但这些似乎没有任何帮助。

我查看了您链接到的身份validation问题页面,并引起了我的注意: https : //stackoverflow.com/a/4227642/633098 。

因为你说使用的算法不再是SHA1,但更可能是SHA256我开始尝试使用HMAC哈希,而不是SHA256。 它起初没有用,但后来我尝试使用由密码和盐组成的连接字符串和salt(= key)本身,并且它有效。

这是我做的简单function:

 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)); 

结果哈希: TQN7m8OWIyBOKVwzegWSUBVq7o7 + KWFBc46J + B77mLw =