Почему ComputeHash не действует детерминированно?
-
02-10-2019 - |
Вопрос
Я столкнулся с интересной проблемой. Похоже, что ComputeHash () для хэша "Hmacsha256" не ведет себя детерминистически. Если я создаю два экземпляра халагоритма с использованием hashalgorithm.create ("hmacsha256") .. и запустить Computehash,, Я получаю два разных результата. Ниже приведен пример статического класса, который демонстрирует это поведение.
internal static string HashPassword(byte[] bAll)
{
using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256"))
{
return Convert.ToBase64String(s.ComputeHash(bAll));
}
}
Я также пытался сделать звонок не статичным (на самом деле он начался не статичный, и у меня двойной и тройной и в четыре раза проверил свой вход окно как:
Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)
И запустить это дважды в окне Immidiates через точку останова в методе возвращает два разных хэша.
Я знаю, что хэш должен быть детерминированным .. так что дает? Что -то происходит с бегом в отладчике? Или какие -либо другие идеи? На самом деле это всего лишь два странных для слов прямо сейчас:-P ..
Спасибо, Джош
Решение
HMAC - это ключевой хэш. Я не вижу ключа в вашем примере кода.
HashAlgorithm.Create("HMACSHA256")
Создает экземпляр Hashalgorithm, поэтому он ничего не знает о ключе. Это, вероятно, просто звонит Этот конструктор HMACSHA256:
public HMACSHA256()
Инициализирует новый экземпляр класса HMACSHA256 с случайно сгенерированный ключ.
Вы хотите этот конструктор:
public HMACSHA256(byte[] key)
Инициализирует новый экземпляр класса HMACSHA256 с указанными ключевыми данными.
Если вы не хотите жестко кодировать алгоритм HMAC, вы можете использовать Keyedhashalgorithm.create и предоставить конкретный ключ, установив Keyedhashalgorithm.key свойство.
Если вы не хотите использовать ключ, используйте не ключевый хэш, такой как SHA256.
Другие советы
Просто добавляя к этому в надежде спасти кого -то головной болью, через которую я прошел.
В случае .NET поставщик членов, убедитесь, что у вас есть настройка в вашем web.config или app.config. В противном случае он автоматически генерирует свой собственный ключ ... дерьтесь по аутентификации, а затем в конце концов воинственно смеется над вами.
Вам нужен ключ для Hmacsha256. Ключ будет случайным, если он не будет передаваться в конструктор.