Разница между Hashlib и System.Security.Cryptography.HashAlgorithm
Я пытаюсь понять, как работают алгоритмы хеширования, особенно SHA3-512. Чтобы увидеть, как это работает, я искал коды в Google и наткнулся на Hashlib. Код не работает, так как у меня нет библиотеки Hashlib (не знаю, как она должна называться). Как я могу получить это, и это единственный способ применить SHA3-512 в C#?
Некоторые основные вещи, которые я хочу знать,
Что такое
Hashlib
?Это библиотека?
Является ли выходной результат / рабочий процесс / функция
Hashlib
а такжеSystem.Security.Cryptography.HashAlgorithm
так же? Если нет, то в чем разница между ними?
Изменить: Извините за удаление нескольких вопросов из середины. Я чувствую, что их здесь больше не нужно показывать.
2 ответа
Примечание: обновлено 2017.
Hashlib
Hashlib - это библиотека хеш-реализаций:
Он включает в себя реализации довольно многих криптографических и некриптографических хэшей, которые уже поддерживаются платформой.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);