Почему 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));
}
}
Я также пытался сделать вызов не статичным (на самом деле он начинался нестатично, и я дважды и трижды и четырехкратно проверил мой входной массив... он абсолютно одинаков при каждом вызове.. Я даже делал вещи в immidiate окно, как:
Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)
И выполнение этого дважды в окне imidiates через точку останова в методе возвращает два разных хеша.
Я знаю, что Хэш должен быть детерминированным.. Так что же дает? что-то происходит с запуском в отладчике? Или есть другие идеи? на самом деле это просто два странных слова прямо сейчас:-P..
Спасибо джош
3 ответа
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. Ключ будет случайным, если он не передан в конструктор.