我们以前使用C#.net 2.0创建一个Web应用程序。
使用以下代码对用户密码进行哈希处理并将其存储在数据库中。
private const string encryptionKey = "AE09F72B007CAAB5";
HMACSHA1 hash = new HMACSHA1();
hash.Key = HexToByte(encryptionKey);
encodedPassword = Convert.ToBase64String(
hash.ComputeHash(Encoding.Unicode.GetBytes(password)));
现在我们打算迁移到php。
因此,当用户想要重新登录时,我们会遇到问题。
应该使用什么等价的方法来使数据库中的哈希值起作用?
例如,要编码的密码是pa55w0rd
获得的哈希值是oK9NOVhpTkxLoLfvh1430SFb5gw =
谢谢。
最佳答案
在您的C#应用程序中,您以两种不同的方式生成byte []数组,但结果略有不同。您的PHP脚本需要完全模拟它们。
hash.Key = HexToByte(encryptionKey)您传入一个16个字符长的字符串,并得到8个字节的数组,就像hash.Key = new byte[]{0xAE, 0x09, 0xF7, 0x2B, 0x00, 0x7C, 0xAA, 0xB5 };
一样,但是由于Encoding.Unicode,
string password = "pa55w0rd";
byte[] b = Encoding.Unicode.GetBytes(password)
返回一个包含16个元素的数组,例如byte[] b = { 0x112, 0x0, 0x97, 0x0, 0x53, 0x0, 0x53, 0x0, 0x119, 0x0, 0x48, 0x0, 0x114, 0x0,0x100, 0x0 }
在您的PHP脚本中,您可以使用$data = mb_convert_encoding($password, 'UTF16-LE')将$ password的编码更改为utf-16le,以实现类似的结果。不知道任何编码的hash_hmac()会将字符串视为16字节单字节编码的字符串,就像.net中的hash.ComputeHash(byte [])一样。
<?php
$password = "pa55w0rd";
$key = HexToBytes("AE09F72B007CAAB5"); // 8 bytes, hex
// $to must be 'UTF-16LE'
// $from depends on the "source" of $password
$data = mb_convert_encoding($password, 'UTF-16LE', 'ASCII');
// I've saved this script as an ascii file -> the string literal is ASCII encoded
// therefore php's strlen() returns 8 for $password and 16 for $data
// this may differ in your case, e.g. if the contents of $password comes from a
// http-request where the data is utf-8 encoded. Adjust the $from parameter for
// mb_convert_encoding() accordingly
echo 'Debug: |data|=', strlen($data), ' |password|=', strlen($password), "\n";
$h = HexToBytes(hash_hmac('sha1', $data, $key));
echo 'hmac-sha1: ', base64_encode($h);
function HexToBytes($s) {
// there has to be a more elegant way...
return join('', array_map('chr', array_map('hexdec', str_split($s, 2))));
}
printsDebug:| data | = 16 | password | = 8hmac-sha1:oK9NOVhpTkxLoLfvh1430SFb5gw =
关于c# - 从C#.net 2.0迁移到php,因此密码的哈希值-如何解决?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1017150/