Как обращаться к криптографическому сервису чтобы бизнес-логика знала как можно меньше о процессе шифрования?
Продвинутые темы
К криптографическому сервису обращаются через абстракцию/фасад: бизнес-логика вызывает простой интерфейс (`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 (зависимость от абстракции), Стратегия (сменные алгоритмы). Даёт инкапсуляцию, слабую связанность, заменяемость реализации, тестируемость и безопасность (детали в одном месте).