Почему ComputeHash не действует детерминистически?
У меня возникла интересная проблема. Кажется, что ComputeHash() для хэша "HMACSHA256" не ведет себя детерминистически.. если я создаю два экземпляра HashAlgorithm с использованием HashAlgorithm.Create( "HMACSHA256" ).. И запустите ComputeHash, я получаю два разных результата. Ниже приведен пример статического класса, демонстрирующий это поведение.
internal static string HashPassword(byte[] bAll)
{
using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256"))
{
return Convert.ToBase64String(s.ComputeHash(bAll));
}
}
Я также попытался сделать вызов нестационарным (на самом деле он начал нестатический, и у меня есть двойной и тройной, а quadrudruple проверил мой входной массив.. его абсолютно то же самое при каждом вызове.. Я даже сделал что-то в последнем окне, например:
Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)
И запуск этого дважды в окне immidiates через точку останова в методе возвращает два разных хэша.
Я знаю, что Хэш должен быть детерминированным.. Так что же дает? что-то происходит с запуском в отладчике? Или любые другие идеи? на самом деле это всего лишь два странных слова: -P..
Спасибо
Джош
Ответы
Ответ 1
HMAC - это хеш-ключ. Я не вижу ключа в вашем примере кода.
HashAlgorithm.Create("HMACSHA256")
создает экземпляр HashAlgorithm, поэтому он ничего не знает о ключе. Вероятно, он просто вызывает этот конструктор HMACSHA256:
public HMACSHA256()
Инициализирует новый экземпляр класса HMACSHA256 с произвольно сгенерированным ключом.
Вы хотите этот конструктор:
public HMACSHA256(byte[] key)
Инициализирует новый экземпляр класса HMACSHA256 с указанными ключевыми данными.
Если вы не хотите жестко кодировать алгоритм HMAC, вы можете использовать KeyedHashAlgorithm.Create и указать конкретный ключ, установив свойство KeyedHashAlgorithm.Key.
Если вы не хотите использовать ключ, используйте несимметричный хеш, например SHA256.
Ответ 2
Просто добавив к этому в надежде спасти кого-то головную боль, через которую я прошел.
В случае .Net Memberhip Provider убедитесь, что у вас есть параметр в вашем web.config или app.config. Иначе он автоматически генерирует свой собственный ключ... дерьмо на аутентификацию, а затем воинственно смеется над вами в конце.
Ответ 3
Вам нужен ключ для HMACSHA256. Ключ будет случайным, если он не передается в конструктор.