Подтвердить что ты не робот

Почему 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..

Спасибо Джош

4b9b3361

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