Что такое и с какой целью необходимо использовать хэширование? Основные виды хэширования.
Сложность: Новичок.
Вступление
Данная статья будет повествовать о том, что такое хэширование и какие алгоритмы хэширования используются в плагине hash, а также будет приведена сравнительная таблица, в которой можно будет увидеть и сравнить характеристики тех или иных алгоритмов хэширования, поддерживаемых данным плагином.
Содержание
Раздел 1: Что такое хэширование и плагин hash
Хэш (хеш) — это криптографическая функция, которая представляет собой математический алгоритм, преобразующий произвольный массив данных (информацию) в строку фиксированной длины, состоящую из цифр и букв.
Как работает процесс хэширования:
Вначале определяют, целостность каких файлов нужно контролировать. Для каждого файла производится вычисления значения его хэша по специальному алгоритму с сохранением результата. Через необходимое время производится аналогичный расчет и сравниваются результаты. Если значения отличаются, значит информация содержащаяся в файле была изменена.
Основная особенность хэш-функций — это то, что их нельзя расхэшировать, невозможно вернуть единожды хэшированную строку данных в обратный читабельный вид.
Где используется:
Анализ при помощи хэш-функций часто используется для контроля целостности и сверки уникальности важных файлов операционной системы, программ, а также с целью защиты личных данных на просторах сети Интернет, таких как пароль, ключ или иное значение, которое не требует обратной расшифровки, но требует контроля/сравнения значений.
Какими характеристиками должна обладать хэш-функция:
-
Должна уметь выполнять преобразования данных произвольной длины в фиксированную.
-
Должна иметь открытый алгоритм, чтобы можно было исследовать её криптостойкость.
-
Должна быть односторонней, то есть не должно быть математической возможности по результату определить исходные данные.
-
Должна «сопротивляться» коллизиям, т.е. не должна выдавать одинаковых значений при разных входных данных.
-
Не должна требовать больших вычислительных ресурсов.
-
При малейшем изменении входных данных результат должен существенно изменяться.
Чтобы рассмотреть процесс хэширование во всей его красе, мы будем использовать сопутствующий плагин для фреймворка Flutter:
hash — сборник криптографических хэш-функций, написанный на чистом языке Dart, поддерживает такие платформы как Android, iOS, Linux, macOS, Windows, Web.
Плагин поддерживает следующие алгоритмы:
-
SHA-1
-
SHA-224
-
SHA-256
-
SHA-384
-
SHA-512 (вдобавок SHA-512/224, SHA-512/256)
-
MD5
-
RIPEMD-160
-
HMAC
Раздел 2: SHA
SHA («Secure Hash Algorithm») — одно из самых, если не самое популярное семейство алгоритмов хэширования.
Всего есть 3 основных категории:
-
SHA-1 — второй в семействе алгоритм криптографического хэширования, предшественником является SHA-0, который отозвали сославшись на ошибку и позже заменили улучшенной версией, вот этим самым SHA-1. Разработан и опубликован агентством национальной безопасности США в 1995 году, как стандарт для безопасного хэширования. Алгоритм построен на идее функции сжатия.
-
SHA-2 — подсемейство криптографических хэш-функций (SHA-224, SHA-256, SHA-384, SHA-512, SHA-512/224, SHA-512/256), также создано и опубликовано агентством национальной безопасности США, в этот стандарт вдобавок была добавлена функция SHA-1, разработанная в 1995 году. Алгоритмы SHA-2 построены на основе структуры Меркла-Дамгора.
-
SHA-3 — Keccak, алгоритм хэширования, победитель конкурса на новый стандарт в 2012 году, который должен был заменить SHA-1 и SHA-2, но т.к. до сегодняшнего дня не было предложено серьезных атак на алгоритм SHA-2, переход на SHA-3 не является необходимым. Алгоритм построен по принципу криптографической губки. Т.к. в рассматриваемом плагине нет реализации данного алгоритма, могу предложить вашему вниманию плагин sha3, написанный на чистом языке Dart и реализующий необходимый функционал.
Примеры хэш-функций c использованием алгоритма SHA (язык Dart):
static String hashSHA1(String text) { return sha1.convert(utf8.encode(text)).toString(); } static String hashSHA224(String text) { return sha224.convert(utf8.encode(text)).toString(); } static String hashSHA256(String text) { return sha256.convert(utf8.encode(text)).toString(); } static String hashSHA384(String text) { return sha384.convert(utf8.encode(text)).toString(); } static String hashSHA512(String text) { return sha512.convert(utf8.encode(text)).toString(); } static String hashSHA512224(String text) { return sha512224.convert(utf8.encode(text)).toString(); } static String hashSHA512256(String text) { return sha512256.convert(utf8.encode(text)).toString(); }
Раздел 3: MD5
MD («Message-Digest») — широко использовавшееся семейство хэш алгоритмов.
Включает в себя 6 версий:
-
MD1 — закрытый алгоритм, спецификация которого не была опубликована.
-
MD2 — был разработан в 1989 году для использования в качестве одного из криптографических алгоритмов, а в 1990 году был предложен в качестве замены BMAC (Bidirectional MAC).
-
MD3 — никогда не был опубликован, скорее всего разработка была заброшена.
-
MD4 — разработан в 1990 году, из особенностей, используется в протоколе аутентификации MS-CHAP, разработанном корпорацией Майкрософт для выполнения процедур проверки подлинности удаленных рабочих станций Windows.
-
MD5 — разработан в 1991 году, является самым популярным алгоритмом из всего семейства, до сегодняшнего дня повсеместно широко используется для проверки целостности информации и хэширования паролей.
-
MD6 — разработан в 2008 году, не пользуется огромной популярностью в связи с заявленными самим разработчиком в нем недостатков и проигрыше в конкурсе 2008-2012 годах, в котором и победил новый алгоритм SHA-3, позже алгоритм был улучшен, но популярности ему это не прибавило.
Пример хэш-функции c использованием алгоритма MD5 (язык Dart):
static String hashMD5(String text) { return md5.convert(utf8.encode(text)).toString(); }
Раздел 4: RIPEMD-160
RIPEMD («RACE Integrity Primitives Evaluation Message Digest») — алгоритм, разработанный в 1996 году, использует принципы MD4, а по производительности сравним с алгоритмом SHA-1.
Существуют следующие версии хэш-функции, они отличаются лишь по битности, о чем и говорит их название:
Заявленная автором поддержка алгоритма RIPEMD-160 отсутствует.
Раздел 5: HMAC
HMAC («Hash-based Message Authentication Code») — один из механизмов проверки целостности информации, позволяющий гарантировать то, что данные, передаваемые или хранящиеся в ненадёжной среде, не были изменены посторонними лицами.
MAC — стандарт, описывающий способ обмена данными и способ проверки целостности передаваемых данных с использованием секретного ключа.
Два клиента, использующие MAC, как правило, используют общий секретный ключ. HMAC — надстройка над MAC, механизм обмена данными с использованием секретного ключа. В названии может уточняться используемая хеш-функция: HMAC-MD5, HMAC-SHA1, HMAC-RIPEMD160…
Сам механизм был разработан в 1996 году, а в 1997 году был выпущена документация стандарта.
В HMAC данные «смешиваются» с ключом, и хеш-функция применяется дважды.
Преимущества HMAC:
-
возможность использования хеш-функций, уже имеющихся в программном продукте.
-
отсутствие необходимости внесения изменений в реализации существующих хеш-функций (внесение изменений может привести к ухудшению производительности и ухудшению криптостойкости).
-
возможность замены хеш-функции в случае появления более безопасной или более быстрой хеш-функции.
В обязательном порядке применяется для реализации протокола IPsec.
Пример хэш-функции с использованием HMAC и SHA-256 (язык Dart):
static Hmac hashHMACSHA256(String text, String key) { return Hmac(sha256.convert(utf8.encode(text)) as Hash, utf8.encode(key)); }
Сравнительная таблица
SHA-1 |
SHA-224 |
SHA-256 |
SHA-384 |
SHA-512 |
MD5 |
RIPEMD-160 |
|
Год создания |
1995 |
2004 |
2002 |
2002 |
2002 |
1991 |
1996 |
Число раундов |
80 |
64 |
64 |
80 |
80 |
64 |
80 |
Размер выхода |
160 |
224 |
256 |
384 |
512 |
128 |
160 |
Размер блока |
512 |
512 |
512 |
1024 |
1024 |
512 |
512 |
Размер длины |
64 |
64 |
64 |
128 |
128 |
64 |
64 |
Размер слова |
32 |
32 |
32 |
64 |
64 |
32 |
32 |
Взломан? |
Нет |
Нет |
Нет |
Нет |
Взломан, признан небезопасным |
Взломан атакой класса «коллизия» |
|
Ссылки на документацию |
Также хотелось бы обратить ваше внимание на производительность хэш-функций (меньше — лучше):
Данные производительности были взяты из этой статьи про производительность хэш-функций.
Заключение
Подводя итоги, можно сказать одно, что самыми криптостойкими алгоритмами за все время своего существования показало себя семейство SHA, в частности новый стандарт SHA-3 Keccak, который является пионером в плане защиты. Тем не менее, выбор используемого алгоритма для хэширования будет ещё зависеть не только от его безопасности, но и от его скорости, выбирайте с умом.
ссылка на оригинал статьи https://habr.com/ru/post/661409/
Добавить комментарий