Ответ
Хэш-функция — это математическая функция, которая преобразует входные данные произвольного размера в выходную битовую строку фиксированной длины (хэш или хэш-сумма).
Основные свойства криптографической хэш-функции:
- Детерминированность: Один и тот же ввод всегда даёт один и тот же хэш.
- Быстрота вычисления: Хэш должен вычисляться быстро для любых входных данных.
- Необратимость (One-way): По хэшу должно быть практически невозможно восстановить исходные данные.
- Стойкость к коллизиям (Collision Resistance): Должно быть практически невозможно найти два разных набора входных данных, которые дают одинаковый хэш.
- Лавинный эффект: Малейшее изменение во входных данных (например, на один бит) должно приводить к кардинальному изменению хэша.
Пример в Go (SHA-256):
package main
import (
"crypto/sha256"
"fmt"
)
func main() {
data := []byte("hello world")
hash := sha256.Sum256(data)
fmt.Printf("Исходные данные: %sn", data)
fmt.Printf("Хэш SHA-256: %xn", hash)
// Вывод: b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9
}
Основные области применения в бэкенде:
- Хранение паролей: Пароли хранятся не в открытом виде, а как хэши. Для этого используют специальные медленные хэш-функции (например,
bcrypt
,scrypt
,Argon2
), чтобы усложнить перебор. Обязательно используется соль (случайная строка, уникальная для каждого пользователя), чтобы защититься от атак по радужным таблицам. - Проверка целостности данных: При передаче файла можно также передать его хэш. На принимающей стороне хэш вычисляется заново и сравнивается с полученным. Если хэши совпадают, данные не были повреждены.
- Структуры данных: Не криптографические (быстрые) хэш-функции лежат в основе хэш-таблиц (в Go это
map
), которые обеспечивают быстрый доступ к данным по ключу. - Цифровые подписи: Хэш документа подписывается приватным ключом для подтверждения авторства и неизменности.