← Назад к вопросам

Какие знаешь типы шифрования?

2.0 Middle🔥 121 комментариев
#Безопасность#Основы Java

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы шифрования в Java

Шифрование — критически важная часть security-архитектуры приложений. В Java используются различные типы шифрования, каждое с собственными применениями, преимуществами и недостатками.

Симметричное шифрование (Symmetric Encryption)

В симметричном шифровании используется один и тот же ключ для шифрования и дешифрования.

AES (Advanced Encryption Standard) — золотой стандарт:

import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;

public class AESEncryption {
    public static SecretKey generateKey(int keySize) throws Exception {
        KeyGenerator keyGen = KeyGenerator.getInstance("AES");
        keyGen.init(keySize);
        return keyGen.generateKey();
    }
    
    public static String encrypt(String data, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.ENCRYPT_MODE, key);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }
    
    public static String decrypt(String encryptedData, SecretKey key) throws Exception {
        Cipher cipher = Cipher.getInstance("AES");
        cipher.init(Cipher.DECRYPT_MODE, key);
        byte[] decodedData = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedData = cipher.doFinal(decodedData);
        return new String(decryptedData);
    }
}

Характеристики AES:

  • Размеры ключей: 128, 192, 256 бит
  • Скорость: Очень быстро (аппаратное ускорение в процессорах)
  • Применение: Шифрование данных в покое, secure communications
  • ВАЖНО: Используй CBC или GCM режимы, НЕ ECB!

DES/3DES — устаревший:

Cipher cipher = Cipher.getInstance("DESede"); // 3DES
  • Ключ всего 168 бит — слабо
  • Медленнее AES
  • Используется только для legacy-систем

Асимметричное шифрование (Asymmetric Encryption)

Использует пару ключей: публичный для шифрования, приватный для дешифрования.

RSA (Rivest-Shamir-Adleman):

import javax.crypto.Cipher;
import java.security.*;
import java.util.Base64;

public class RSAEncryption {
    public static KeyPair generateKeyPair(int keySize) throws Exception {
        KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
        keyGen.initialize(keySize);
        return keyGen.generateKeyPair();
    }
    
    public static String encrypt(String data, PublicKey publicKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);
        byte[] encryptedData = cipher.doFinal(data.getBytes());
        return Base64.getEncoder().encodeToString(encryptedData);
    }
    
    public static String decrypt(String encryptedData, PrivateKey privateKey) throws Exception {
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher.init(Cipher.DECRYPT_MODE, privateKey);
        byte[] decodedData = Base64.getDecoder().decode(encryptedData);
        byte[] decryptedData = cipher.doFinal(decodedData);
        return new String(decryptedData);
    }
}

Характеристики RSA:

  • Размеры ключей: 2048, 4096 бит (минимум 2048!)
  • Скорость: Медленнее AES в 1000+ раз
  • Применение: Обмен ключами, digital signatures, PKI инфраструктура
  • Ограничение: Может шифровать только данные меньше размера ключа

Хеширование (Hashing) — не техничное шифрование

Односторонняя функция, которую нельзя развернуть:

import java.security.MessageDigest;
import java.util.Base64;

public class HashingExample {
    public static String hashPassword(String password) throws Exception {
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(password.getBytes());
        return Base64.getEncoder().encodeToString(hash);
    }
}

Типы:

  • SHA-256 — 256 бит, безопасный
  • SHA-512 — 512 бит, еще более безопасный
  • MD5 — НИКОГДА! Взломан, используется только для контрольных сумм
  • bcrypt — специально для паролей (с солью и итерациями)

Гибридный подход (Hybrid Encryption)

Комбинирует преимущества обоих методов:

public class HybridEncryption {
    // 1. Генерируем случайный AES ключ
    SecretKey aesKey = AESEncryption.generateKey(256);
    
    // 2. Шифруем данные с AES (быстро)
    String encryptedData = AESEncryption.encrypt(data, aesKey);
    
    // 3. Шифруем AES ключ с RSA (публичным ключом отправителя)
    String encryptedAesKey = RSAEncryption.encrypt(
        Base64.getEncoder().encodeToString(aesKey.getEncoded()),
        publicKey
    );
    
    // Отправляем: encryptedData + encryptedAesKey
}

Почему это лучше:

  • Преимущества RSA: безопасный обмен ключами
  • Преимущества AES: высокая скорость
  • Используется в TLS/SSL, PGP, OpenPGP

Режимы операции (Mode of Operation)

ECB (Electronic Codebook) — ❌ НИКОГДА

  • Одинаковые блоки текста → одинаковые блоки зашифрованного текста
  • Видны паттерны

CBC (Cipher Block Chaining) — ✅ Хороший

Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");

GCM (Galois/Counter Mode) — ✅ BEST (аутентификация + шифрование)

Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding");

Выбор алгоритма на практике

ЗадачаАлгоритмПричина
Шифрование данных на дискеAES-256Быстро, стандарт, безопасно
Безопасный обмен ключамиRSA-2048+Асимметричный, PKI инфраструктура
Хеширование паролейbcrypt/PBKDF2Защита от перебора
Цифровая подписьRSA + SHA-256Аутентификация + целостность
TLS/SSLAES-GCM (гибрид)Стандарт интернета

Security best practices в Java

  • Используй javax.crypto и java.security пакеты
  • Никогда не создавай свои алгоритмы
  • Генерируй ключи через KeyGenerator / KeyPairGenerator
  • Использование IV (Initialization Vector) для каждого шифрования в CBC/GCM
  • Хранить приватные ключи в KeyStore, не в коде
  • Регулярно обновляй Java для security patches

На собеседовании

Покажи понимание:

  1. Разницы между симметричным и асимметричным
  2. Когда что использовать (кейсы)
  3. Практического примера с AES или RSA
  4. Security practices (не хардкодить ключи, использовать KeyStore)
  5. Trade-offs: скорость vs. безопасность

Это покажет серьёзность в отношении к security и глубокое понимание cryptography.