middle
Чем отличается шифрование данных at rest и in transit?
Шифрование at rest — защита данных, хранящихся на диске (БД, файлы, бэкапы). Шифрование in transit — защита данных во время передачи по сети от отправителя к получателю. Оба вида шифрования обязательны в production-средах.
Шифрование in transit (при передаче)
Протоколы:
- TLS 1.2 / 1.3 — основной протокол для HTTPS, межсервисных вызовов
- mTLS — взаимная аутентификация
- SSH — для административного доступа
Примеры конфигурации:
Пример
# Spring Boot: подключение к PostgreSQL через SSL
spring:
datasource:
url: jdbc:postgresql://db-master:5432/banking?ssl=true&sslmode=verify-full&sslrootcert=/certs/ca.crt
# Spring Boot: подключение к Kafka через SSL
spring:
kafka:
ssl:
trust-store-location: classpath:truststore.jks
trust-store-password: ${KAFKA_TRUSTSTORE_PASSWORD}
security:
protocol: SSL
Шифрование at rest (при хранении)
1. Шифрование на уровне диска (Full Disk Encryption)
Пример
# LUKS (Linux Unified Key Setup)
sudo cryptsetup luksFormat /dev/sdb
sudo cryptsetup luksOpen /dev/sdb encrypted_data
sudo mkfs.ext4 /dev/mapper/encrypted_data
2. Шифрование на уровне базы данных
Пример
-- PostgreSQL: шифрование столбцов с помощью pgcrypto
CREATE EXTENSION pgcrypto;
INSERT INTO clients (name, card_number) VALUES (
'Иванов',
pgp_sym_encrypt('4111111111111111', 'encryption_key')
);
SELECT name, pgp_sym_decrypt(card_number::bytea, 'encryption_key')
FROM clients;
3. Шифрование на уровне приложения (Application-Level Encryption)
Пример AES-256-GCM шифрования в Java
public class EncryptionService {
private static final String ALGORITHM = "AES/GCM/NoPadding";
private static final int TAG_LENGTH = 128;
private static final int IV_LENGTH = 12;
public byte[] encrypt(byte[] data, SecretKey key) throws Exception {
byte[] iv = new byte[IV_LENGTH];
SecureRandom.getInstanceStrong().nextBytes(iv);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.ENCRYPT_MODE, key, new GCMParameterSpec(TAG_LENGTH, iv));
byte[] encrypted = cipher.doFinal(data);
return ByteBuffer.allocate(iv.length + encrypted.length)
.put(iv).put(encrypted).array();
}
public byte[] decrypt(byte[] encryptedData, SecretKey key) throws Exception {
ByteBuffer buffer = ByteBuffer.wrap(encryptedData);
byte[] iv = new byte[IV_LENGTH];
buffer.get(iv);
byte[] cipherText = new byte[buffer.remaining()];
buffer.get(cipherText);
Cipher cipher = Cipher.getInstance(ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, key, new GCMParameterSpec(TAG_LENGTH, iv));
return cipher.doFinal(cipherText);
}
}
4. Шифрование через Vault Transit Engine
Пример
# Шифрование данных через Vault (ключ не покидает Vault)
vault write transit/encrypt/payment-key \
plaintext=$(echo -n "4111111111111111" | base64)
# Расшифрование
vault write transit/decrypt/payment-key \
ciphertext="vault:v1:AbcDef..."
Что шифровать
| Данные | At rest | In transit |
|---|---|---|
| Номера карт (PAN) | AES-256, маскирование | TLS 1.2+ |
| Персональные данные (ПДн) | AES-256 | TLS 1.2+ |
| Пароли | Bcrypt/Argon2 (хеширование, не шифрование!) | TLS 1.2+ |
| Резервные копии БД | AES-256 | TLS/SSH |
| Логи | Шифрование диска | TLS (syslog-TLS) |
Требование PCI DSS: данные карт обязательно должны быть зашифрованы и при хранении, и при передаче.
На собеседовании: интервьюер ожидает чёткое разделение at rest и in transit, знание TLS для transit и AES-256 для rest. Частая ошибка — путать хеширование паролей (Bcrypt) с шифрованием (AES) и не упомянуть Vault Transit Engine.