在PHP

时间:2018-08-01 15:11:46

标签: php .net encryption passwords sha512

我已经尝试了一段时间,以通过PHP API对.NET中加密的密码进行身份验证,尽管尝试了不同的方法,但我似乎无法使它匹配。

使用SHA512对密码进行加密,并使用此确切功能(我无法控制,无法修改,不使用盐)将其存储在binary(64)字段中的数据库中:

> public byte[] GetHashablePw(string pwByte)
>     {
>         System.Security.Cryptography.SHA512Managed sm = new System.Security.Cryptography.SHA512Managed();
>         System.Text.UnicodeEncoding u = new System.Text.UnicodeEncoding();
>         byte[] b = new byte[-1 + 1];
>         b = sm.ComputeHash(u.GetBytes(pwByte));
>         return b;
>     }

当我想比较用户提供的密码时,我尝试了以下几种不同的方式:

    $pwhash = openssl_digest($_POST['pw'], 'sha512');
    $pwhash = bin2hex(pack('H*', hash('SHA512',$_POST['pw'])));
    $pwhash = openssl_digest(utf8_decode($_POST['pw']), 'sha512');
    $pwhash = bin2hex(hash('sha512', $_POST['pw'], true));

所有这些都确实返回了相同的结果,但没有一个与.NET中存储在数据库中的内容匹配。

我通过以下方式将密码哈希存储在数据库中:

bin2hex($pwFromDB);

在一种特殊情况下,我将其作为存储在数据库中的哈希值获得:

4c0dc75a062dd4957f6f91350f6d3f54f910989e6ffe82749cdc580b9eae5dce0ee743cd513d005d0c399e23b0190809767fe1a57f9fecbce0a928296181c14e

当我使用相同的密码从PHP函数获得此信息时:

c3cf6055cbb36e3eace5ca470922de6e754ec93cf80f35459c910f4381899483e2c29565f062476724dad94929527d53eeae5a1cd708c6227574e58748d354aa

在了解我所缺少的内容方面,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

C#使用的是UnicodeEncoding,即UTF-16LE。

您需要使PHP数据具有相同的表示形式,因为加密操作是针对字节而不是文本进行的。 http://php.net/manual/en/function.mb-convert-encoding.php可能就是您想要的。


此外,该字符串未加密。加密要求执行撤消操作(解密)。此处所做的是哈希。此密码已散列