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

Ответ

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

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

Ответ 18+ 🔞

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

Вот есть у нас три главных подхода, как данные на бэкенде превратить из читаемых в «иди нахуй, хакер».

1. Симметричное — оно же «один ключ на всех»

Представь, у тебя есть сундук и один ключ. Им ты его и закрываешь, и открываешь. Быстро? Овердохуища как быстро! Проблема одна — как этому ключу до второго чувака добраться, чтобы он тоже сундук открыл? Если по дороге перехватят — пиши пропало, всё, пиздец.

  • Что юзают: AES, ChaCha20, всякое такое.
  • Где втыкают: Когда надо зашифровать что-то большое и быстро — файлы там, или трафик по интернету гонять.

    В Go, если не хочешь, чтобы тебя имели, берут обычно AES в режиме GCM — он и шифрует, и сразу проверяет, что никто по дороге не накосячил.

2. Асимметричное — оно же «публичный и приватный, ёпта»

Тут уже цирк с ключами. Есть два: один — публичный, его можешь всем раздать, хоть на заборе напиши. Им данные зашифровывают. А второй — приватный, его ты под подушкой хранишь, им эти же данные расшифровывают. Гениально? Вроде да. Проблема обмена ключами решена, но работает это всё, как черепаха в сиропе — медленно, блядь.

  • Что юзают: RSA, ECDSA.
  • Где втыкают: Чтобы безопасно договориться о том самом быстром симметричном ключе (привет, TLS), или чтобы цифровую подпись на документе нарисовать.

    Вот, смотри, как на Go примерно выглядит этот саботаж:

    // Генерируем пару ключей
    privateKey, _ := rsa.GenerateKey(rand.Reader, 2048)
    publicKey := &privateKey.PublicKey
    secretMessage := []byte("секретные похождения")
    
    // Шифруем публичным ключом
    encrypted, _ := rsa.EncryptOAEP(sha256.New(), rand.Reader, publicKey, secretMessage, nil)
    // А расшифровать эту хуйню может только тот, у кого приватный ключ. Магия, блядь!

3. Хеширование — оно же «точка невозврата»

А это, дружок, вообще не шифрование! Это билет в один конец. Берешь данные, пропускаешь через мясорубку-алгоритм, и на выходе получаешь строку фиксированной длины — хеш. Обратно восстановить? Ни хуя! Никак. Вообще.

  • Что юзают: SHA-256, bcrypt.
  • Где втыкают: Чаще всего — для паролей, ёбушки-воробушки! Чтобы даже если базу утянут, пароли в чистом виде не светить.

    Внимание, важный момент, а то многие ебут мозг: для паролей НЕЛЬЗЯ использовать быстрые штуки вроде SHA-256. Надо брать специально замедленные и с «солью», типа bcrypt, чтобы перебор был долгим и мучительным.

    // Хешируем пароль
    password := []byte("мой_супер_пупер_пароль")
    hashedPassword, _ := bcrypt.GenerateFromPassword(password, bcrypt.DefaultCost)
    
    // А потом проверяем
    err := bcrypt.CompareHashAndPassword(hashedPassword, password)
    // Если err == nil, значит пароль сошёлся, красава. Нет — иди нахуй.

Вот и вся наука. Главное — не перепутай, где что применять, а то будет не защита, а пиздопроебибна.