Ответ
В бэкенде используются три основных подхода к шифрованию данных:
1. Симметричное шифрование
Используется один и тот же ключ для шифрования и расшифровки. Оно очень быстрое, но главная проблема — безопасная передача ключа.
- Алгоритмы: AES, ChaCha20, DES.
-
Применение: Шифрование больших объемов данных, например, файлов или трафика (в составе TLS).
В Go для симметричного шифрования часто используют AES в режиме GCM, который обеспечивает аутентификацию и шифрование.
2. Асимметричное (с публичным ключом)
Используется пара ключей: публичный для шифрования и приватный для расшифровки. Это решает проблему обмена ключами, но работает медленнее симметричного.
- Алгоритмы: RSA, ECDSA.
-
Применение: Установка защищенного соединения (TLS handshake), цифровые подписи, безопасный обмен симметричными ключами.
// Пример шифрования с помощью RSA privateKey, _ := rsa.GenerateKey(rand.Reader, 2048) publicKey := &privateKey.PublicKey secretMessage := []byte("secret data") encrypted, _ := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, secretMessage, nil) // Расшифровать можно только с помощью privateKey
3. Хеширование
Это необратимое преобразование данных в строку фиксированной длины (хеш). Не является шифрованием в классическом смысле, так как расшифровать хеш нельзя.
- Алгоритмы: SHA-256, SHA-512, bcrypt, Scrypt.
-
Применение: Хранение паролей, проверка целостности данных.
Важно: для паролей нужно использовать медленные, "соленые" хеш-функции, такие как
bcrypt
, а не быстрые, как SHA-256.// Пример хеширования пароля с bcrypt password := []byte("super_secret_password") hashedPassword, _ := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost) // Проверка пароля err := bcrypt.CompareHashAndPassword(hashedPassword, password) // if err == nil, пароль верный