Почему ComputeHash не действует детерминистически? - PullRequest
12 голосов
/ 06 июля 2010

Я столкнулся с интересной проблемой .. Кажется, что 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));
    }
}

Я также пытался сделать вызов не статичным (на самом деле он начинался нестатично, и я дважды, трижды и в четыре раза проверил мой входной массив ... он абсолютно одинаков при каждом вызове .. Я даже делал вещи в непосредственном окне вроде:

Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)

И выполнение этого дважды в окне imidiates через точку останова в методе возвращает два разных хеша.

Я знаю, что Хэш должен быть детерминированным .. Так что же дает? что-то происходит с запуском в отладчике? Или есть другие идеи? на самом деле это просто два странных слова прямо сейчас :-P ..

Спасибо Josh

Ответы [ 3 ]

24 голосов
/ 06 июля 2010

HMAC - это хэш с ключами. Я не вижу ключ в вашем примере кода.

HashAlgorithm.Create("HMACSHA256") создает экземпляр HashAlgorithm, поэтому он ничего не знает о ключе. Вероятно, он просто вызывает этот конструктор HMACSHA256 :

public HMACSHA256()

Инициализирует новый экземпляр класса HMACSHA256 с случайно сгенерированным ключом .

Вы хотите этот конструктор :

public HMACSHA256(byte[] key)

Инициализирует новый экземпляр класса HMACSHA256 с указанными ключевыми данными.

Если вы не хотите жестко кодировать алгоритм HMAC, вы можете использовать KeyedHashAlgorithm.Create и указать определенный ключ, установив свойство KeyedHashAlgorithm.Key .

Если вы не хотите использовать ключ, используйте хеш без ключа, например SHA256.

5 голосов
/ 11 октября 2010

Просто добавляю к этому в надежде спасти кого-то головную боль, через которую я прошел.

В случае .Net Membership Provider , убедитесь, что у вас есть настройка в вашем web.config или app.config.В противном случае он автоматически сгенерирует свой собственный ключ ... дерьмо при аутентификации, а затем воинственно над тобой смеется в конце.

3 голосов
/ 06 июля 2010

Вам нужен ключ для HMACSHA256.Ключ будет случайным, если он не будет передан в конструктор.

...