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

Какие данные можно делать публичными, а какие должны оставаться приватными?

1.8 Middle🔥 171 комментариев
#Python Core

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

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

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

Классификация данных: публичные vs приватные

Правильная классификация данных критична для безопасности и соответствия регуляциям (GDPR, CCPA).

ПРИВАТНЫЕ ДАННЫЕ (PII — Personally Identifiable Information)

Эти данные НИКОГДА не должны быть публичными:

1. Аутентификационные данные

# ОПАСНО! Никогда не логируй и не отправляй
user_password = "secure_password123"
api_key = "sk_live_51234567890"
auth_token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."
private_key = "-----BEGIN PRIVATE KEY-----"

Что делать:

  • Хешировать пароли (bcrypt, argon2)
  • Использовать переменные окружения для секретов
  • Nikогда не логировать целиком

2. Финансовые данные

# ОПАСНО
credit_card = "4111-1111-1111-1111"
ssn = "123-45-6789"  # Social Security Number
bank_account = "98765432"
cvv = "123"

Что делать:

  • Использовать PCI DSS для хранения
  • Использовать сервис-провайдеров (Stripe, PayPal)
  • Хранить только последние 4 цифры
  • Никогда не логировать

3. Персональная информация

# ОПАСНО
full_name = "John Doe"
date_of_birth = "1990-01-15"
home_address = "123 Main St, Springfield"
phone_number = "+1-555-0123"
email = "john@example.com"  # Частично приватная
social_media_ids = "facebook_id_12345"

Что делать:

  • Минимизировать сбор данных
  • Использовать аноним при возможности
  • Запрашивать явное согласие (GDPR consent)
  • Позволять удаление (right to be forgotten)

4. Медицинские и биометрические данные

# ОЧЕНЬ ОПАСНО
medical_records = "diagnosis: diabetes"
biometric_data = "fingerprint"
genetic_data = "DNA sequence"

Что делать:

  • Специальное шифрование (HSM — Hardware Security Module)
  • Аудит всех доступов
  • Соответствие HIPAA

5. Данные об истории действий

# ОПАСНО
purchase_history = ["viagra", "therapy books", "bankruptcy lawyer"]
location_history = [(lat, lng, timestamp), ...]
search_history = "how to hide money"
browsing_history = [...]

Что делать:

  • Не связывать с идентичностью без согласия
  • Предоставлять контроль над данными
  • Удалять по запросу

УСЛОВНО ПУБЛИЧНЫЕ ДАННЫЕ

Можно делать публичными только в определённых контекстах:

1. Профильная информация (если явно разрешено)

class UserPublicProfile:
    username: str  # Безопасно
    avatar_url: str  # Безопасно
    bio: str  # Если пользователь выбрал публичность
    # Но НЕ:
    # email: str  # Только если явно разрешено
    # phone: str  # Никогда
    # location: str  # Только город, не адрес
    # joined_date: str  # Безопасно

2. Профессиональная информация

class LinkedInProfile:
    job_title: str  # Публичное
    company_name: str  # Публичное
    education: str  # Публичное
    # Но НЕ:
    # salary: str  # Приватно
    # home_address: str  # Приватно

3. Контент, который создал пользователь

class Post:
    title: str  # Публичное
    content: str  # Публичное
    author: str  # Username, НЕ full name
    created_at: datetime  # Безопасно
    # Но НЕ:
    # author_email: str  # Приватно
    # author_ip: str  # Приватно

ПОЛНОСТЬЮ ПУБЛИЧНЫЕ ДАННЫЕ

Эти данные безопасно делать публичными:

class PublicData:
    # Агрегированные данные
    total_users: int = 1000000  # Публично
    trending_topics: List[str] = [...]  # Публично
    
    # Общая статистика
    average_rating: float = 4.5  # Публично
    
    # Метаинформация
    api_version: str = "1.0"  # Публично
    status: str = "healthy"  # Публично

Архитектурный подход

# 1. Разделяй модели данных

# Для БД (все данные)
class UserModel(Base):
    id: int
    email: str
    password_hash: str
    phone: str
    ssn: str

# Для API (только публичные)
class UserPublicDTO(BaseModel):
    id: int
    username: str
    avatar_url: str

# Для авторизованного пользователя (больше данных)
class UserPrivateDTO(BaseModel):
    id: int
    username: str
    email: str  # Свой email видит сам
    phone: str  # Свой телефон видит сам

# Преобразование
def get_user_public(user_id: int) -> UserPublicDTO:
    user = db.query(UserModel).get(user_id)
    return UserPublicDTO(
        id=user.id,
        username=user.username,
        avatar_url=user.avatar_url
    )

Регуляции и стандарты

GDPR (EU):

  • Right to access
  • Right to deletion
  • Data portability
  • Privacy by design

CCPA (California):

  • Right to know
  • Right to delete
  • Right to opt-out

HIPAA (Healthcare):

  • Protected Health Information (PHI) требует особой защиты

Логирование и мониторинг

# ПЛОХО: логируем всё
logger.info(f"User {user.email} logged in with password {password}")

# ХОРОШО: логируем только безопасное
logger.info(f"User {user.id} logged in successfully")

# Скрывай чувствительные данные
def mask_sensitive_data(data: dict) -> dict:
    masked = data.copy()
    if 'credit_card' in masked:
        masked['credit_card'] = f"****-{masked['credit_card'][-4:]}"
    if 'password' in masked:
        masked['password'] = "***"
    return masked

logger.info(f"Request: {mask_sensitive_data(request.data)}")

Шифрование

from cryptography.fernet import Fernet

# Для приватных данных в БД
cipher = Fernet(encryption_key)
encrypted_ssn = cipher.encrypt(ssn.encode())

# Для передачи
# ВСЕГДА используй HTTPS, НЕ HTTP
# Проверяй сертификаты SSL

Чеклист данных

Перед выпуском API:

  • Все пароли хеширован
  • Все API ключи в переменных окружения
  • Финансовые данные не логируются
  • DTO модели разделены по уровню доступа
  • Все чувствительные данные зашифрованы
  • HTTPS в production
  • Логирование не содержит PII
  • Есть механизм удаления данных пользователя
  • Есть согласие на обработку (GDPR)

Правило: если сомневаешься — делай приватным.