Gymterview
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.