Почему мой хэш-код PHP SHA256 не эквивалентен С# SHA256 Управленный хэш
Почему они не такие же?
PHP:
$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) );
С#
public static string ComputeHash(string plainText, string salt)
{
// Convert plain text into a byte array.
byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
byte[] saltBytes = Encoding.UTF8.GetBytes(salt);
SHA256Managed hash = new SHA256Managed();
// Compute hash value of salt.
byte[] plainHash = hash.ComputeHash(plainTextBytes);
byte[] concat = new byte[plainHash.Length + saltBytes.Length];
System.Buffer.BlockCopy(saltBytes, 0, concat, 0, saltBytes.Length);
System.Buffer.BlockCopy(plainHash, 0, concat, saltBytes.Length, plainHash.Length);
byte[] tHashBytes = hash.ComputeHash(concat);
// Convert result into a base64-encoded string.
string hashValue = Convert.ToBase64String(tHashBytes);
// Return the result.
return hashValue;
}
Ответы
Ответ 1
С# выводит строку с кодировкой base64, а PHP выводит число в шестнадцатеричном виде. Лучшим сравнением может быть передача параметра true в конец хэш-функции PHP и base64 в результате:
$hash = base64_encode(
hash('sha256', $userData['salt'] . hash('sha256', $password), true )
);
Ответ 2
Потому что они разные. Ваш код С# кодирует вычисленный хэш в кодировке Base64 в конце. PHP просто возвращает строку шестнадцатеричных цифр.
Ответ 3
Первый подозреваемый:
Encoding.UTF8.GetBytes(plainText);
С# использует UTF-8, ваш PHP, вероятно, нет, но вам может повезти, если вы используете строго буквы из подмножества US-ASCII.
Второй подозреваемый:
Convert.ToBase64String(tHashBytes);
Нет ничего о Base64 в вашем PHP.
Так как PHP даст вам результат с шестнадцатеричным кодированием, вы также должны переключиться на Hex на своем С#. См. этот ответ для решений.
Ответ 4
Ну, я не программист на С#, но одна вещь, которая бросается на меня, такова:
// Convert result into a base64-encoded string.
string hashValue = Convert.ToBase64String(tHashBytes);
Вы кодируете base64 конечный результат в С#? Потому что вы не в PHP...
Ответ 5
C#
string toHash = "abcdefg";
SHA256Managed hash = new SHA256Managed();
byte[] signatureData = hash.ComputeHash(new UnicodeEncoding().GetBytes(toHash));
string hashResult = System.Convert.ToBase64String(signatureData);
PHP
print base64_encode(hash("sha256",mb_convert_encoding("abcdefg","UTF-16LE"),true));
Напишите как верхний код, они одинаковы