Почему мой хэш PHP SHA256 не эквивалентен C # SHA256Managed hash

Почему это не то же самое?

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

person Lemontongs    schedule 30.08.2011    source источник
comment
Потому что вопрос некорректен. Это эквивалент. Только это не выглядит одинаково   -  person sehe    schedule 31.08.2011
comment
это может быть так, но я добавил base64_encode (), и они по-прежнему не дают того же результата.   -  person Lemontongs    schedule 31.08.2011


Ответы (6)


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

 $hash = base64_encode(
           hash('sha256', $userData['salt'] . hash('sha256', $password), true )
         );
person cwallenpoole    schedule 30.08.2011
comment
Спасибо за быстрый ответ! Я пробовал это, и хотя они теперь ближе, они не дают такой же результат. Есть другие мысли? - person Lemontongs; 31.08.2011
comment
@Lemontongs внесли ли вы какие-либо изменения в приведенный выше код ... Я получаю другой результат на php и c # - person SHANib; 16.04.2013

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

person Mchl    schedule 30.08.2011

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

Encoding.UTF8.GetBytes(plainText);

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

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

Convert.ToBase64String(tHashBytes);

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

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

person emboss    schedule 30.08.2011

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

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

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

person DaveRandom    schedule 30.08.2011

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

Пишите как верхний код, они такие же

person lei.liu    schedule 01.03.2013

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

Работает на меня.

person Maroun Tannous    schedule 16.02.2020