← Назад к вопросам
Когда требуется дополнительное шифрование данных?
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 | Нет | Защита |
| Логирование | Нет | Исключение |
| Утечка БД | Видны | Зашифрованы |
Дополнительное шифрование — это оборонительная стратегия для защиты чувствительных данных на всех уровнях.