我需要在 PHP 中生成一个与T-SQL中HASHBYTES函数的输出相匹配的哈希。
以下是最初用于在 T-SQL 中生成哈希的代码:
declare @input varchar(15) = [this is the incoming value entered by the user]
declare @salt binary(32) = CRYPT_GEN_RANDOM(32)
declare @saltchars nvarchar(32) = cast(@salt as nvarchar(32) )
declare @inputchars nvarchar(50) = cast(@input as nvarchar(50) )
declare @sha binary(32) = HASHBYTES('SHA2_256', @passwordchars + @saltchars)
对于输入“pete1234matt”,我们得到以下输出:
salt = 0x75D6215CA44339B645E86BE790FF562D3EE4BC51034FDC6A9697F767BB961B5B
sha = 0x979EEAC93B5F6624269634202D9F3B5B8008113B03A83D104784184E0F9361F8
现在这是我编写的 PHP 代码,我采用提供的和输入,然后将它们编码为 UTF-16LE,就像我期望转换为 nvarchar 所做的那样。那是对的吗?
$password = 'pete1234matt';
$salt = 0x75D6215CA44339B645E86BE790FF562D3EE4BC51034FDC6A9697F767BB961B5B;
$saltchars = mb_convert_encoding($salt, 'UTF-16LE');
$passwordchars = mb_convert_encoding($password, 'UTF-16LE');
$sha = hash('sha256', $passwordchars . $saltchars);
//$sha == 17b87bd0491f32f1e474ad9293e2fe5db56ed0a5c9939435f0984fdc04806dc5
//Expected: 979EEAC93B5F6624269634202D9F3B5B8008113B03A83D104784184E0F9361F8
我倾向于盐存在编码问题,但不能完全弄清楚我哪里出错了。任何对字符编码和 T-SQl 有更多了解的人都可以在这里帮帮我!