Я столкнулся с интересной проблемой.. Кажется, что ComputeHash () для хеша "HMACSHA256" не ведет себя детерминировано.. если я создаю два экземпляра использования HashAlgorithm HashAlgorithm. Создайте ("HMACSHA256").. И выполненный ComputeHash, я получаю два различных результата.. ниже пример статический класс тот показ этого поведения.
internal static string HashPassword(byte[] bAll)
{
using (HashAlgorithm s = HashAlgorithm.Create("HMACSHA256"))
{
return Convert.ToBase64String(s.ComputeHash(bAll));
}
}
Я также попытался выполнить вызов, не статичный (на самом деле, он запустился не статичный, и я имею дважды и трижды и quadrudruple проверил мой входной массив.. абсолютно то же на каждом вызове.. Я даже сделал материал в immidiate окне как:
Convert.ToBase64String(HashAlgorithm.Create("HMACSHA256").ComputeHash(bAll)
И выполнение этого дважды в immidiates окне через точку останова в методе возвращает два различных хеша..
Я знаю, что Хеш, предполагают, чтобы быть детерминированным.. Таким образом, что дает? что-то продолжает выполнение в отладчике? Или какие-либо другие идеи? действительно это равняется всего двум странным для слов прямо сейчас :-P..
Спасибо Josh
HMAC - это хэш с ключом. Я не вижу ключа в коде вашего примера.
HashAlgorithm.Create("HMACSHA256")
создает экземпляр HashAlgorithm, поэтому он ничего не знает о ключе. Скорее всего, он просто вызывает этот HMACSHA256 Constructor:
public HMACSHA256()
Инициализирует новый экземпляр класса HMACSHA256 с случайно сгенерированным ключом.
Вам нужен этот конструктор:
public HMACSHA256(byte[] key)
Инициализирует новый экземпляр класса HMACSHA256 с указанными ключевыми данными.
Если вы не хотите жестко кодировать алгоритм HMAC, вы можете использовать KeyedHashAlgorithm.Create и предоставить определенный ключ, установив свойство KeyedHashAlgorithm.Key.
Если вы не хотите использовать ключ, то используйте хэш без ключа, например SHA256.
Вам нужен ключ для HMACSHA256. Ключ будет случайным, если он не передан в конструктор.