Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用PHP对ASP.NET成员身份中的用户进行身份验证_C#_Php_Asp.net_.net 4.0 - Fatal编程技术网

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

C# 使用PHP对ASP.NET成员身份中的用户进行身份验证,c#,php,asp.net,.net-4.0,C#,Php,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($dec

我在尝试使用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" />

想法?知道为什么我的哈希与数据库中存储的内容不匹配吗(以及为什么/如何在通过ASP.NET站点登录时工作)?我尝试过交换散列函数,反转密码/盐连接,并在敲击计算机时大声喊叫,但这些似乎都没有帮助。

我查看了您链接到的身份验证问题页面,其中一个特定的答案吸引了我的注意:

因为你说使用的算法不再是SHA1,而更可能是SHA256,所以我开始尝试HMAC哈希,取而代之的是SHA256。起初它不起作用,但后来我尝试将由密码和salt组成的连接字符串与salt(=密钥)本身结合使用,结果成功了

下面是我制作的简单函数:

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=


你能用C代码显示哈希函数吗?我假设您自己将其转换为PHP?它应该使用默认的ASP.NET成员资格哈希函数。代码位于:。我一字不差地使用了在那里找到的代码,也得到了不同的结果,所以我想知道这里是否还有其他东西在起作用?哇哦!我已经解决了,伙计!!获得了正确的哈希:
TQN7m8OWIyBOKVwzegWSUBVq7o7+KWFBc46J+B77mLw=
发布一些代码作为答案?:)哦,是的,你来了:)你太棒了!不确定我是如何在另一篇帖子中忽略了这一点的,我从网上的其他来源得到了很多关于.NET4中新的哈希函数的虚假信息。是的,密钥是使用HMAC和密钥(salt),而不是常规的哈希函数。祝你好运
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));