Почему мой хэш-код PHP SHA256 не эквивалентен C # SHA256 Управленный хэш

Почему это не так?

PHP:

$hash = hash('sha256', $userData['salt'] . hash('sha256', $password) ); 

C #

  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; } 

C # выводит строку с кодировкой base64, а PHP выводит число в шестнадцатеричном виде. Лучшее сравнение может состоять в том, чтобы передать параметр true в конец хэш-функции PHP и base64 в результате:

  $hash = base64_encode( hash('sha256', $userData['salt'] . hash('sha256', $password), true ) ); 

Потому что они разные. Ваш код C # кодирует вычисленный хэш в кодировке Base64 в конце. PHP просто возвращает строку шестнадцатеричных цифр.

Первый подозреваемый:

 Encoding.UTF8.GetBytes(plainText); 

C # использует UTF-8, ваш PHP, вероятно, нет, но вам может повезти, если вы используете строго буквы из подмножества US-ASCII.

Второй подозреваемый:

 Convert.ToBase64String(tHashBytes); 

Нет ничего о Base64 в вашем PHP.

Поскольку PHP даст вам результат с шестнадцатеричным кодированием, вы также должны переключиться на Hex на своем C #. См. Этот ответ для решений.

Ну, я не программист на C #, но одна вещь, которая бросается на меня, такова:

 // Convert result into a base64-encoded string. string hashValue = Convert.ToBase64String(tHashBytes); 

Вы base64-кодируете конечный результат в C #? Потому что вы не в PHP …

 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)); 

Напишите, как верхний код, они одинаковы