Что такое хэш-функция? Какие у неё свойства и где она применяется?

Ответ

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

Основные свойства криптографической хэш-функции:

  1. Детерминированность: Один и тот же ввод всегда даёт один и тот же хэш.
  2. Быстрота вычисления: Хэш должен вычисляться быстро для любых входных данных.
  3. Необратимость (One-way): По хэшу должно быть практически невозможно восстановить исходные данные.
  4. Стойкость к коллизиям (Collision Resistance): Должно быть практически невозможно найти два разных набора входных данных, которые дают одинаковый хэш.
  5. Лавинный эффект: Малейшее изменение во входных данных (например, на один бит) должно приводить к кардинальному изменению хэша.

Пример в 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), которые обеспечивают быстрый доступ к данным по ключу.
  • Цифровые подписи: Хэш документа подписывается приватным ключом для подтверждения авторства и неизменности.