Как хешировать строку или файл
Функции хеширования - одна из важнейших особенностей современной криптографии. Поскольку я решил изучить 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
.