Как хешировать строку или файл

Функции хеширования - одна из важнейших особенностей современной криптографии. Поскольку я решил изучить Go, почему бы не попробовать реализовать хеш-функцию файла просто для удовольствия?

Примечание. В этом руководстве используется версия Go 1.13.4.

Вступление

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

Он используется в основном для решения принципа криптографии целостности. Сообщение может быть изменено во время обмена данными между отправителем и получателем. Хеш-функция может гарантировать, что сообщение не будет изменено.

Основные особенности хеш-функции:

  • Вывод фиксированной длины: хеш-функции получают сообщение (ввод) любого размера и всегда производят один и тот же размер вывода.
  • Эффективность: выполнение не должно быть трудным с вычислительной точки зрения.
  • Детерминированный: одно и то же сообщение всегда будет давать одно и то же значение хеш-функции.

И чтобы его можно было использовать в криптографии, он должен обладать следующими свойствами:

  • Сопротивление прообразу: учитывая хеш-значение, должно быть очень сложно найти сообщение, которое его породило.
  • Сопротивление второму прообразу: учитывая сообщение m, должно быть очень сложно найти другое сообщение n, которое дает такой же хэш, как m.
  • Устойчивость к коллизиям: должно быть очень сложно найти два разных сообщения, которые производят один и тот же хеш.

Хеш-функция используется во многих приложениях в Интернете, например:

  • Целостность документа: вы наверняка раньше загружали очень большой файл с FTP-сайта. И у них, вероятно, был хеш-индикатор для этого.

  • Хранение паролей: ваш пароль не сохраняется в обычном виде, а хешируется в базе данных. По крайней мере, хорошие системы это делают.
  • Уникальный идентификатор: поскольку каждое сообщение должно выдавать один и тот же вывод и не имеет других, которые генерируют тот же вывод, вы можете использовать хэш для однозначной идентификации документа или сообщения. Это то, что Git использует, например, для идентификации каждой фиксации.

  • Доказательство работы: чтобы пользователь мог выполнить действие или опубликовать что-либо, он должен доказать, что выполнил задачу. Это доказательство является гарантией того, что пользователь потратил некоторое время на выработку ответа, удовлетворяющего условию оценщика. Это используется, например, в блокчейнах.

Некоторые популярные хеш-функции включают MD5, SHA и Whirpool.

Хеш строки

Для вычисления хэша нам нужен пакет crypto. Вот доступные хеш-функции:

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

Выход:

   MD5: 1356c67d7ad1638d816bfb822dd2c25d
  SHA1: 201a6b3053cc1422d2c3670b62616221d2290929
SHA256: 1cbec737f863e4922cee63cc2ebbfaafcd1cff8b790d8cfd2e6a5d550b648afa

Хеш файла

Чтобы вычислить хэш из файла, нам нужно создать хеш-значение на основе его содержимого:

  • Создайте новый hash.Hash из пакета crypto (алгоритм, который мы хотим использовать).
  • Добавьте его, написав в его io.Writer функцию.
  • Извлеките сумму, вызвав функцию Sum.

Читайте содержимое файла по частям, чтобы не использовать много памяти.

Заключение

Вычислить хеш-значение из строки или файла с помощью Go очень просто благодаря доступному пакету crypto.