Символ, сгенерированный из хэша SHA-512, не сохраняется в базе данных - PullRequest
1 голос
/ 10 октября 2011

Я хэширую пароль, используя SHA512.Я использую Entity Framework Code-First для своего ORM.

Алгоритм хеширования

public static string CreateSHA512Hash(string pwd, string salt)
{
    string saltAndPwd = String.Concat(pwd, salt);

    var ae = new ASCIIEncoding();
    byte[] hashValue, messageBytes = ae.GetBytes(saltAndPwd);
    var sHhash = new SHA512Managed();

    hashValue = sHhash.ComputeHash(messageBytes);

    sHhash.Dispose();

    return ae.GetString(hashValue);
}

Код для генерации соли:

//Generate a cryptographic random number.
var rng = new RNGCryptoServiceProvider();
var buff = new byte[size];
rng.GetBytes(buff);

rng.Dispose();

// Return a Base64 string representation of the random number.
return Convert.ToBase64String(buff);

Проблема:

По какой-то причине кажется, что хеш-функция генерирует случайным образом некоторые символы, которые после них не сохраняются в базе данных.В этом случае (я не уверен, есть ли другие персонажи, которые это делают), но это \0.

Например.Пароль: testuser.Соль: uvq5i4CfMcOMjKPkwhhqxw==

Сгенерировано хэша: ????j???7?o\0?dE??????:???s?x??u?',Vj?mNB??c???4H???vF\bd?T? (скопировано в режиме дублирования в Visual Studio).

Но EF фактически сохраняет ????j???7?o в базе данных.Если я пытаюсь использовать визуализатор текста в режиме отладки, он также отключается.Если вы заметили, оно обрезается прямо на \0.Все, что я мог найти об этом, это то, что это нулевой символ.

Вопрос

Как мне сохранить этот нулевой символ в базе данных, используя Entity Framework Code-First?Если это не может быть сохранено, как я могу запретить SHA512 генерировать эти символы для меня?

Ответы [ 3 ]

2 голосов
/ 10 октября 2011

Я рекомендую кодировать хеш с Base64 перед сохранением. С другой стороны, кодирование соли с помощью Base64 перед добавлением к паролю звучит странно.

0 голосов
/ 11 октября 2011

Что вы, вероятно, должны сделать:

  • Возвращать массив байтов для хэша SHA512, а не строку.
  • Используйте столбец базы данных BINARY (64) для хранения вашего значения хеша.

Почему ваш метод не работает:

  • Эти строки ASCII заканчиваются на NULL
  • NULL, как вы сказали, \ 0
  • SHA512 создает байтовый массив, и любой байт может иметь значение NULL

Чтобы ответить на ваш конкретный вопрос:

  • wRAR выше говорил:

    return Convert.ToBase64String(hashValue);
    
0 голосов
/ 10 октября 2011

Хеш SHA-256 не генерирует символы, он генерирует байты.Если вы хотите иметь символьную строку, а не байтовый массив, вам нужно преобразовать байты в символьный формат.Как предложил @wRAR, Base64 - это один из распространенных способов сделать это, иначе вы можете просто использовать шестнадцатеричную строку.

...