Я хэширую пароль, используя 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 генерировать эти символы для меня?