Какие хэширующие функции есть в Go и как выбрать подходящую?

Ответ

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

Основные типы хэш-функций в Go

  1. Не криптографические (для скорости и целостности данных)

    • hash/crc32, hash/crc64: Используются для вычисления контрольных сумм (checksums). Идеальны для проверки целостности файлов при передаче или хранении. Очень быстрые, но не подходят для задач безопасности.
    • hash/fnv: Быстрая не криптографическая хэш-функция. Хорошо подходит для хэш-таблиц или других структур данных, где важна скорость, а не защита от коллизий.
  2. Криптографические (для безопасности)

    • crypto/sha1, crypto/sha256, crypto/sha512: Семейство безопасных алгоритмов хэширования. Используются для проверки подлинности данных, хранения паролей (с солью), создания цифровых подписей. SHA-256 является текущим стандартом для большинства задач.
    • crypto/md5: Считается устаревшим и небезопасным для криптографических целей из-за уязвимостей к коллизиям, но все еще может использоваться для проверки целостности файлов, где безопасность не является приоритетом.
  3. Специальный случай: хэширование в map

    • Для встроенного типа map Go использует собственную, очень быструю хэш-функцию. Её реализация не экспортируется и может меняться между версиями Go, в том числе для защиты от атак типа "hash-flooding" (DoS-атаки, использующие коллизии).

Пример выбора и использования

import (
    "crypto/sha256"
    "fmt"
    "hash/crc32"
)

func main() {
    // Задача: Проверить целостность данных
    data := []byte("some important data")
    crc32q := crc32.MakeTable(0xD5828281)
    checksum := crc32.Checksum(data, crc32q)
    fmt.Printf("CRC32 Checksum: %xn", checksum)

    // Задача: Безопасно захэшировать пароль (в реальном приложении нужна соль!)
    secret := []byte("super_secret_password")
    hash := sha256.Sum256(secret)
    fmt.Printf("SHA256 Hash: %xn", hash)
}

Критерии выбора (кратко)

  • Целостность данных?crc32
  • Нужна скорость для структур данных (не безопасность)?fnv
  • Нужна безопасность (пароли, подписи)?sha256, sha512