SHA256 выдает длину 44 вместо длины 64

Я использую следующий код для выполнения SHA256.

public static string GenerateSaltedHash(string plainTextString, string saltString)        
        {            
            byte[] salt = Encoding.UTF8.GetBytes(saltString);
            byte[] plainText = Encoding.UTF8.GetBytes(plainTextString);
            HashAlgorithm algorithm = new SHA256Managed();

            byte[] plainTextWithSaltBytes =
              new byte[plainText.Length + salt.Length];

            for (int i = 0; i < plainText.Length; i++)
            {
                plainTextWithSaltBytes[i] = plainText[i];
            }
            for (int i = 0; i < salt.Length; i++)
            {
                plainTextWithSaltBytes[plainText.Length + i] = salt[i];
            }
            byte[] bytes = algorithm.ComputeHash(plainTextWithSaltBytes);
            return Convert.ToBase64String(algorithm.ComputeHash(plainTextWithSaltBytes));                              
        }

Поскольку я использую SHA256, я ожидаю, что длина результата будет 64. Но я получаю 44.

В чем проблема? Повлияет ли более короткая длина вывода на безопасность?


person Mangesh Kulkarni    schedule 07.01.2015    source источник
comment
Как предположение - похоже, вы конвертируете его в строку Base64 вместо стандартной строки Hex, что даст другую длину.   -  person Origin    schedule 07.01.2015
comment
SHA256 даст вам 32 байта в виде хэша. использование кодировки Base64 дает вам около 44 символов. как сказал @origin, если вместо этого вы представляете каждый байт как его шестнадцатеричное значение (2 символа), вы получите 64 символа.   -  person Simon Halsey    schedule 07.01.2015
comment
Я думаю, это правильно. Я преобразовал каждый байт в строку в формате X2, и я получаю длину 64.   -  person Mangesh Kulkarni    schedule 07.01.2015


Ответы (1)


Base-64 — это 6 бит на символ (2^6 = 64).

256 bits / 6 bits per char = 42.6666 char

И это, очевидно, закончилось как 44 из-за заполнения (вы увидите один или 2 = в конце вывода).

Вы должны ожидать base-16 (шестнадцатеричный AKA), который составляет 4 бита на символ (2 ^ 4 = 16).

256 bits / 4 bits per char = 64 char

Для шестнадцатеричного использования используйте это:

return BitConverter.ToString(bytes).Replace("-", string.Empty);
person weston    schedule 07.01.2015
comment
Существуют ли какие-либо различия в безопасности при использовании этого метода или метода Base64? - person Dalton; 03.04.2018
comment
Нет, они оба просто кодировки. Любой, у кого есть информация о базе 64 или 16, может легко вернуться к исходному двоичному представлению. - person weston; 03.04.2018