Ответ
В бэкенде используются три основных подхода к шифрованию данных:
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, значит пароль сошёлся, красава. Нет — иди нахуй.
Вот и вся наука. Главное — не перепутай, где что применять, а то будет не защита, а пиздопроебибна.