Какие основные виды шифрования используются в бэкенд-разработке и для каких задач?

Ответ

В бэкенде используются три основных подхода к шифрованию данных:

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, пароль верный