Вопрос

Я столкнулся с интересной проблемой. Похоже, что ComputeHash () для хэша "Hmacsha256" не ведет себя детерминистически. Если я создаю два экземпляра халагоритма с использованием 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)

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

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

Спасибо, Джош

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top