Что такое и с какой целью необходимо использовать хэширование? Основные виды хэширования.

Сложность: Новичок.

Вступление

Данная статья будет повествовать о том, что такое хэширование и какие алгоритмы хэширования используются в плагине crypto, а также будет приведена сравнительная таблица, в которой можно будет увидеть и сравнить характеристики тех или иных алгоритмов хэширования, поддерживаемых данным плагином.

Содержание

Раздел 1: Что такое хэширование и плагин crypto

Хэш (хеш) — это криптографическая функция, которая представляет собой математический алгоритм, преобразующий произвольный массив данных (информацию) в строку фиксированной длины, состоящую из цифр и букв.

Как работает процесс хэширования:

Вначале определяют, целостность каких файлов нужно контролировать. Для каждого файла производится вычисления значения его хэша по специальному алгоритму с сохранением результата. Через необходимое время производится аналогичный расчет и сравниваются результаты. Если значения отличаются, значит информация содержащаяся в файле была изменена.

Основная особенность хэш-функций — это то, что их нельзя расхэшировать, невозможно вернуть единожды хэшированную строку данных в обратный читабельный вид.

Где используется:
Анализ при помощи хэш-функций часто используется для контроля целостности и сверки уникальности важных файлов операционной системы, программ, а также с целью защиты личных данных на просторах сети Интернет, таких как пароль, ключ или иное значение, которое не требует обратной расшифровки, но требует контроля/сравнения значений.

Какими характеристиками должна обладать хэш-функция:

  • Должна уметь выполнять преобразования данных произвольной длины в фиксированную.

  • Должна иметь открытый алгоритм, чтобы можно было исследовать её криптостойкость.

  • Должна быть односторонней, то есть не должно быть математической возможности по результату определить исходные данные.

  • Должна "сопротивляться" коллизиям, т.е. не должна выдавать одинаковых значений при разных входных данных.

  • Не должна требовать больших вычислительных ресурсов.

  • При малейшем изменении входных данных результат должен существенно изменяться.

Чтобы рассмотреть процесс хэширование во всей его красе, мы будем использовать сопутствующий плагин для фреймворка Flutter:

crypto — сборник криптографических хэш-функций, написанный на чистом языке Dart, поддерживает такие платформы как Android, iOS, Linux, macOS, Windows, Web.

Плагин поддерживает следующие алгоритмы:

  • SHA-1

  • SHA-224

  • SHA-256

  • SHA-384

  • SHA-512 (вдобавок SHA-512/224, SHA-512/256)

  • MD5

  • HMAC (в том числе HMAC-MD5, HMAC-SHA1, HMAC-SHA256)

Отличительные черты выходных кэшей с использованием различных хэш-функций
Отличительные черты выходных кэшей с использованием различных хэш-функций

Раздел 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: 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

Взломан?

Взломан

Нет

Нет

Нет

Нет

Взломан, признан небезопасным

Взломан атакой класса "коллизия"

Ссылки на документацию

Ссылка

Ссылка

Ссылка

Ссылка

Ссылка

Ссылка

Ссылка


Также хотелось бы обратить ваше внимание на производительность хэш-функций (меньше - лучше):

Обычные хэш-функции
Обычные хэш-функции
Хэш-функции с использованием HMAC
Хэш-функции с использованием HMAC

Данные производительности были взяты из этой статьи про производительность хэш-функций.

Заключение

Подводя итоги, можно сказать одно, что самыми криптостойкими алгоритмами за все время своего существования показало себя семейство SHA, в частности новый стандарт SHA-3 Keccak, который является пионером в плане защиты. Тем не менее, выбор используемого алгоритма для хэширования будет ещё зависеть не только от его безопасности, но и от его скорости, выбирайте с умом.

Комментарии (2)


  1. saipr
    19.04.2022 15:32

    Обзор алгоритмов хэширования без Стрибог-а ("Streebog") выглядит неполным.


    1. Legend5366 Автор
      20.04.2022 18:18

      Спасибо за комментарий, но кажется вы не поняли цель моей статьи, я хотел сделать поверхностный обзор алгоритмов хэширования на основе плагина hash для Flutter, какие алгоритмы он поддерживает, что такое хэширование, краткая историческая справка, сравнение основных характеристик и производительности алгоритмов, а также вставки из кода, чтобы те люди, которые захотят использовать этот плагин, могли без проблем получить некоторое описание плагина и используемых им алгоритмов, а также готовый код для реализации данных хэш-функций. И вначале статьи стоит приписка "Сложность: Новичок", чтобы каждый желающий, даже тот, кто не владеет программированием в нужной степени и не имеет соответствующих знаний мог прочитать статью и иметь представление о том, что это такое и для чего оно нужно. Переименую статью чтобы не возникало подобных вопросов.