在 PHP 中发布验证从 .NET 加密的 SHA512 密码
Issue authenticating SHA512 password encrypted from .NET in PHP
我已经尝试了一段时间从 PHP API 验证在 .NET 中加密的密码,尽管尝试了不同的方法,但我似乎无法让它匹配。
密码使用 SHA512 加密并存储在数据库中的二进制 (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));
所有 return 结果确实相同,但 none 匹配从 .NET 存储在数据库中的内容。
我将我的密码散列存储在数据库中:
bin2hex($pwFromDB);
在一种特殊情况下,我将其作为哈希存储在数据库中:
4c0dc75a062dd4957f6f91350f6d3f54f910989e6ffe82749cdc580b9eae5dce0ee743cd513d005d0c399e23b0190809767fe1a57f9fecbce0a928296181c14e
虽然我使用相同的密码从 PHP 函数中得到这个:
c3cf6055cbb36e3eace5ca470922de6e754ec93cf80f35459c910f4381899483e2c29565f062476724dad94929527d53eeae5a1cd708c6227574e58748d354aa
如果能帮助我理解我所缺少的,我将不胜感激。
C# 使用的是 UnicodeEncoding
,它是 UTF-16LE。
您需要将 PHP 数据转化为相同的表示形式,因为密码学对字节而非文本进行操作。 http://php.net/manual/en/function.mb-convert-encoding.php 或许就是你想要的。
此外,该字符串未加密。加密需要有一个撤销操作(解密)。这里所做的是散列。此密码已 散列 。
我已经尝试了一段时间从 PHP API 验证在 .NET 中加密的密码,尽管尝试了不同的方法,但我似乎无法让它匹配。
密码使用 SHA512 加密并存储在数据库中的二进制 (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));
所有 return 结果确实相同,但 none 匹配从 .NET 存储在数据库中的内容。
我将我的密码散列存储在数据库中:
bin2hex($pwFromDB);
在一种特殊情况下,我将其作为哈希存储在数据库中:
4c0dc75a062dd4957f6f91350f6d3f54f910989e6ffe82749cdc580b9eae5dce0ee743cd513d005d0c399e23b0190809767fe1a57f9fecbce0a928296181c14e
虽然我使用相同的密码从 PHP 函数中得到这个:
c3cf6055cbb36e3eace5ca470922de6e754ec93cf80f35459c910f4381899483e2c29565f062476724dad94929527d53eeae5a1cd708c6227574e58748d354aa
如果能帮助我理解我所缺少的,我将不胜感激。
C# 使用的是 UnicodeEncoding
,它是 UTF-16LE。
您需要将 PHP 数据转化为相同的表示形式,因为密码学对字节而非文本进行操作。 http://php.net/manual/en/function.mb-convert-encoding.php 或许就是你想要的。
此外,该字符串未加密。加密需要有一个撤销操作(解密)。这里所做的是散列。此密码已 散列 。