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

Когда требуется дополнительное шифрование данных?

2.4 Senior🔥 161 комментариев
#Безопасность

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

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

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

Когда требуется дополнительное шифрование данных

Дополнительное шифрование данных требуется в специфических сценариях, где стандартной HTTPS недостаточно. Это важный аспект безопасности, особенно при работе с чувствительной информацией.

1. Чувствительные персональные данные

Примеры:

  • Паспортные данные
  • Номера кредитных карт
  • SSN (социальный номер)
  • Медицинская информация
  • Биометрические данные
from cryptography.fernet import Fernet

class DataEncryption:
    def __init__(self, key: bytes):
        self.cipher = Fernet(key)
    
    def encrypt_ssn(self, ssn: str) -> str:
        return self.cipher.encrypt(ssn.encode()).decode()
    
    def decrypt_ssn(self, encrypted_ssn: str) -> str:
        return self.cipher.decrypt(encrypted_ssn.encode()).decode()

2. Данные в покое (At Rest)

Данные, хранящиеся в БД, должны шифроваться на уровне приложения:

from django.db import models
from encrypted_model_fields.fields import EncryptedTextField

class User(models.Model):
    name = models.CharField(max_length=100)
    ssn = EncryptedTextField()  # Зашифрована в БД
    passport = EncryptedTextField()

В FastAPI с SQLAlchemy:

from cryptography.fernet import Fernet
from sqlalchemy.types import TypeDecorator, String

class EncryptedType(TypeDecorator):
    impl = String
    cache_ok = True
    
    def __init__(self, key: bytes):
        super().__init__()
        self.cipher = Fernet(key)
    
    def process_bind_param(self, value, dialect):
        if value is None:
            return None
        return self.cipher.encrypt(value.encode()).decode()
    
    def process_result_value(self, value, dialect):
        if value is None:
            return None
        return self.cipher.decrypt(value.encode()).decode()

3. Inter-service коммуникация

Когда микросервисы общаются и данные критичны:

import requests, json
from cryptography.fernet import Fernet

class SecureServiceClient:
    def __init__(self, service_url: str, encryption_key: bytes):
        self.url = service_url
        self.cipher = Fernet(encryption_key)
    
    def send_secure_data(self, data: dict) -> dict:
        encrypted_payload = self.cipher.encrypt(
            json.dumps(data).encode()
        ).decode()
        
        response = requests.post(
            f"{self.url}/process",
            json={"encrypted_data": encrypted_payload},
            headers={"Authorization": f"Bearer {TOKEN}"}
        )
        
        return response.json()

4. Данные в логах

Чувствительные данные не должны попадать в логи:

import logging, re
from cryptography.fernet import Fernet

class SensitiveDataFilter(logging.Filter):
    def filter(self, record):
        record.msg = self.mask_sensitive_data(str(record.msg))
        return True
    
    def mask_sensitive_data(self, text: str) -> str:
        text = re.sub(r'\d{4}[\s-]?\d{4}[\s-]?\d{4}[\s-]?\d{4}', '****-****-****-****', text)
        text = re.sub(r'\d{3}-\d{2}-\d{4}', '***-**-****', text)
        return text

logging.getLogger().addFilter(SensitiveDataFilter())

5. PII (Personally Identifiable Information)

GDPR, CCPA, HIPAA требуют шифрования персональных данных:

from cryptography.fernet import Fernet

class UserEncryption:
    def __init__(self, key: bytes):
        self.cipher = Fernet(key)
    
    def encrypt_pii(self, user_data: dict) -> dict:
        pii_fields = ["email", "phone", "address", "date_of_birth"]
        
        encrypted = {}
        for field, value in user_data.items():
            if field in pii_fields and value:
                encrypted[field] = self.cipher.encrypt(
                    str(value).encode()
                ).decode()
            else:
                encrypted[field] = value
        
        return encrypted
    
    def decrypt_pii(self, encrypted_data: dict) -> dict:
        pii_fields = ["email", "phone", "address", "date_of_birth"]
        
        decrypted = {}
        for field, value in encrypted_data.items():
            if field in pii_fields and value and isinstance(value, str):
                try:
                    decrypted[field] = self.cipher.decrypt(
                        value.encode()
                    ).decode()
                except:
                    decrypted[field] = value
            else:
                decrypted[field] = value
        
        return decrypted

6. End-to-End Encryption (E2E)

Когда только пользователь должен видеть данные:

from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes

class E2EEncryption:
    def __init__(self):
        self.private_key = rsa.generate_private_key(
            public_exponent=65537,
            key_size=2048,
        )
        self.public_key = self.private_key.public_key()
    
    def encrypt_message(self, message: str, public_key):
        return public_key.encrypt(
            message.encode(),
            padding.OAEP(
                mgf=padding.MGF1(algorithm=hashes.SHA256()),
                algorithm=hashes.SHA256(),
                label=None
            )
        )

7. Переменные окружения и секреты

from dotenv import load_dotenv
import os
from cryptography.fernet import Fernet

class SecureConfig:
    def __init__(self, encryption_key: bytes):
        self.cipher = Fernet(encryption_key)
        load_dotenv()
    
    def get_secret(self, key: str) -> str:
        encrypted_value = os.getenv(key)
        if not encrypted_value:
            raise ValueError(f"Secret {key} not found")
        return self.cipher.decrypt(encrypted_value.encode()).decode()

Когда требуется дополнительное шифрование

Требуется:

  • Чувствительные персональные данные
  • GDPR/CCPA/HIPAA compliance
  • Данные в покое в БД
  • Критичная информация в логах
  • Inter-service коммуникация
  • End-to-End encryption

Не требуется:

  • Публичные данные
  • Метаданные для индексирования
  • Некритичная информация
  • Когда HTTPS достаточно

Сравнение уровней защиты

УровеньHTTPSПриложение
TransitЗащитаЗащита + защита
At RestНетЗащита
ЛогированиеНетИсключение
Утечка БДВидныЗашифрованы

Дополнительное шифрование — это оборонительная стратегия для защиты чувствительных данных на всех уровнях.