PassFront
  1. PassFront
  2. База знаний
  3. Продвинутые темы

Как обращаться к криптографическому сервису чтобы бизнес-логика знала как можно меньше о процессе шифрования?

Продвинутые темы

К криптографическому сервису обращаются через абстракцию/фасад: бизнес-логика вызывает простой интерфейс (`encrypt`/`decrypt`), не зная деталей алгоритма, ключей, реализации. Это принцип инкапсуляции и разделения ответственности.

Идея — скрыть детали за интерфейсом

Бизнес-логика не должна знать как шифруется — только что можно зашифровать/расшифровать. Детали (алгоритм, ключи, режимы) скрыты за сервисом:

// Абстракция — бизнес-логика знает только это
interface CryptoService {
  encrypt(data: string): Promise<string>;
  decrypt(data: string): Promise<string>;
}

// Бизнес-логика
class UserService {
  constructor(private crypto: CryptoService) {}
  async saveSecret(secret) {
    const encrypted = await this.crypto.encrypt(secret); // не знает деталей
    await this.repo.save(encrypted);
  }
}

Паттерны для этого

Фасад (Facade)

Простой интерфейс над сложной криптографической подсистемой:

class CryptoFacade {
  encrypt(data) { /* выбор алгоритма, ключей, режима внутри */ }
}

Dependency Injection

Криптосервис внедряется как зависимость — бизнес-логика зависит от абстракции, а не реализации:

new UserService(new AesCryptoService()); // легко заменить реализацию

Стратегия (Strategy)

Разные алгоритмы шифрования за единым интерфейсом (сменные).

Что это даёт

  • Инкапсуляция — детали шифрования в одном месте.
  • Слабая связанность — бизнес-логика не завязана на конкретный алгоритм.
  • Заменяемость — сменить алгоритм/библиотеку, не трогая бизнес-логику.
  • Тестируемость — подставить мок криптосервиса.
  • Безопасность — ключи и детали не разбросаны по коду.

Коротко для собеседования

К криптосервису обращаются через абстракцию (интерфейс encrypt/decrypt), скрывающую алгоритм, ключи, реализацию — паттерны Фасад (простой интерфейс над сложной подсистемой), Dependency Injection (зависимость от абстракции), Стратегия (сменные алгоритмы). Даёт инкапсуляцию, слабую связанность, заменяемость реализации, тестируемость и безопасность (детали в одном месте).

Другие вопросы раздела