Почему 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. Ключ будет случайным, если он не передан в конструктор.

Другие вопросы по тегам