Почему это не так?
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));
Напишите, как верхний код, они одинаковы