Какие знаешь типы шифрования?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы шифрования в 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/SSL | AES-GCM (гибрид) | Стандарт интернета |
Security best practices в Java
- Используй
javax.cryptoиjava.securityпакеты - Никогда не создавай свои алгоритмы
- Генерируй ключи через
KeyGenerator/KeyPairGenerator - Использование IV (Initialization Vector) для каждого шифрования в CBC/GCM
- Хранить приватные ключи в KeyStore, не в коде
- Регулярно обновляй Java для security patches
На собеседовании
Покажи понимание:
- Разницы между симметричным и асимметричным
- Когда что использовать (кейсы)
- Практического примера с AES или RSA
- Security practices (не хардкодить ключи, использовать KeyStore)
- Trade-offs: скорость vs. безопасность
Это покажет серьёзность в отношении к security и глубокое понимание cryptography.