Разница между Hashlib и System.Security.Cryptography.HashAlgorithm

Я пытаюсь понять, как работают алгоритмы хеширования, особенно SHA3-512. Чтобы увидеть, как это работает, я искал коды в Google и наткнулся на Hashlib. Код не работает, так как у меня нет библиотеки Hashlib (не знаю, как она должна называться). Как я могу получить это, и это единственный способ применить SHA3-512 в C#?

Некоторые основные вещи, которые я хочу знать,

  1. Что такое Hashlib?

  2. Это библиотека?

  3. Является ли выходной результат / рабочий процесс / функция Hashlib а также System.Security.Cryptography.HashAlgorithm так же? Если нет, то в чем разница между ними?

Изменить: Извините за удаление нескольких вопросов из середины. Я чувствую, что их здесь больше не нужно показывать.

2 ответа

Решение

Примечание: обновлено 2017.

Hashlib

Hashlib - это библиотека хеш-реализаций:

https://hashlib.codeplex.com/

Он включает в себя реализации довольно многих криптографических и некриптографических хэшей, которые уже поддерживаются платформой.NET (в System.Security.Cryptography) и те, которые не являются. Он понадобится вам - или другой внешней реализации - для поддержки SHA-3.

Обратите внимание, однако, что Hashlib на самом деле не включает SHA-3 в окончательном виде, а скорее, как он выглядел до того, как в него были внесены некоторые изменения. Это означает, что его вывод не будет таким, как вы ожидаете от SHA-3.

HashLib использует архитектуру, отличную от.NET HashAlgorithm для его алгоритмов хеширования - вывод одинаков (для того же алгоритма, например SHA256), использование не. Но у него есть оболочка / адаптер, который может сделать рабочий процесс таким же, как для HashAlgorithm, например:

IHash hash = HashFactory.Crypto.SHA3.CreateKeccak512();
HashAlgorithm hashAlgo = HashFactory.Wrappers.HashToHashAlgorithm(hash);
// Now hashAlgo can be used the same as any .NET HashAlgorithm, e.g.:

// Create byte input from string encoded as UTF-8
byte[] input = Encoding.UTF8.GetBytes("Hello Keccak!");

byte[] output = hashAlgo.ComputeHash(bytes);

Но опять же, имейте в виду, что Keccak512 это не то же самое, что SHA-3 - он не даст тот же хэш, что и фактическая реализация SHA-3 в 512 бит.

Фактические реализации окончательного SHA-3 в C# по-прежнему (2017 г.) немногочисленны, и разница между ними - разница с Keccak, реализованной в Hashlib, крайне незначительна, хотя она имеет большое влияние на вывод, как в случае с алгоритмом хеширования - поскольку Википедия больше не предоставляет пример различия, вот один:

Keccak-512('abc') =
Keccak[1024]('abc', 512) =
    18 58 7d c2 ea 10 6b 9a 15 63 e3 2b 33 12 42 1c
    a1 64 c7 f1 f0 7b c9 22 a9 c8 3d 77 ce a3 a1 e5
    d0 c6 99 10 73 90 25 37 2d c1 4a c9 64 26 29 37
    95 40 c1 7e 2a 65 b1 9d 77 aa 51 1a 9d 00 bb 96

SHA3-512('abc') =
Keccak[1024]('abc' || 01, 512) =
    b7 51 85 0b 1a 57 16 8a 56 93 cd 92 4b 6b 09 6e
    08 f6 21 82 74 44 f7 0d 88 4f 5d 02 40 d2 71 2e
    10 e1 16 e9 19 2a f3 c9 1a 7e c5 76 47 e3 93 40
    57 34 0b 4c f4 08 d5 a5 65 92 f8 27 4e ec 53 f0

Keccak[c](M || s, d) означает "Кекчак с емкостью cсообщение Mбиты суффикса sи выходной размер d".

Это (из статьи в Википедии) единственное отличие между "стандартным"Keccak (и реализацией Hashlib) и SHA-3, как это выглядит в текущей спецификации:

Для SHA3-n дополнительные два бита 01 добавляются к сообщению перед заполнением.

Однако его реализация (например, исправление кода Hashlib) не тривиальна, не зная, как работает Hashlib.

Итак, вы должны использовать SHA-3?

Это зависит от того, для чего вы этого хотите - бесполезно, если вы хотите совместимости с окончательным стандартом SHA-3.

Все семейство Keccak, независимое от SHA-3, само по себе является стандартом, но настройки NIST для SHA-3 по-прежнему являются Keccak - просто его конкретное подмножество (так же, как AES - это подмножество Rijndael). Когда SHA-3 в конечном итоге обнаруживается, например, в самой платформе.NET, скорее всего, это будет просто SHA-3 с выбранными параметрами NIST, а не универсальный Keccak с настраиваемыми параметрами.

SHA-512 (ответ на часть вопроса, которая сейчас удалена)

SHA-512 - это SHA-2 512 бит - не то же самое, что SHA-3 512. Тем не менее, чтобы использовать его, вы просто импортируете System.Security.Cryptography - using в этом случае импортирует пространство имен - делая классы внутри пространства имен доступными для вашего кода.

После этого рабочий процесс такой же, как и любой другой HashAlgorithm,

Итак, я должен использовать SHA-2 или SHA-3 для хэширования паролей?

Ни один из них. Или, по крайней мере, не самостоятельно. И хотя соль улучшает ситуацию, это тоже не оптимальная защита. См. Как безопасно хешировать пароли, особенно начиная с:

Базовая хеш-функция, даже если она защищена как хеш-функция, не подходит для хеширования пароля

Что такое хэшлиб?

По сути, это библиотека, реализующая множество алгоритмов хеширования.

Это библиотека?

да

Являются ли выходные результаты / рабочий процесс / функция Hashlib и System.Security.Cryptography.HashAlgorithm одинаковыми? Если нет, то в чем разница между ними?

Да.

Хашлиб обеспечивает HashLib.HashFactory.Wrappers который может быть использован для преобразования реализации, предоставляемой hashlib в System.Security.Cryptography.HashAlgorithm

Это можно использовать таким образом.

IHash hash = HashFactory.Crypto.CreateSHA256();
System.Security.Cryptography.HashAlgorithm algorith = HashLib.HashFactory.Wrappers.HashToHashAlgorithm(hash);
Другие вопросы по тегам