Имеет ли смысл включать электронную подпись (ЭЦП) в логин или пароль пользователя?

«Имеет ли смысл включать электронную подпись (ЭЦП) в логин или пароль пользователя?» — вопрос из категории Безопасность, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Нет, это архитектурная ошибка и нарушение принципов безопасности. Логин, пароль и электронная подпись — это разные сущности с разным назначением.

Разделение ответственности: Концепт Назначение Хранение и использование
Логин Уникальный публичный идентификатор пользователя в системе. Открыто хранится, используется для поиска учетной записи.
Пароль Секретный ключ для аутентификации (подтверждения личности). Хранится в хэшированном виде (с солью). Никогда не используется для подписи.
ЭЦП (Подпись) Криптографическое средство для целостности и неотрекаемости данных (документов, транзакций). Основана на приватном ключе из сертифицированного ключевого носителя. Не должен быть паролем.

Почему это плохая идея:

  1. Нарушение безопасности: Пароль должен хэшироваться, а приватный ключ для подписи — нет. Их смешение ослабляет криптостойкость.
  2. Потеря неотрекаемости: Если подпись = пароль, то компрометация пароля позволяет злоумышленнику подделывать юридически значимые подписи.
  3. Сложность управления: Пароль пользователь может менять, а ключ ЭЦП часто выдается удостоверяющим центром на длительный срок.

Правильный подход:

// Модель пользователя должна разделять эти атрибуты
public class User {
    private String login;          // Уникальный идентификатор
    private String passwordHash;   // Хэш пароля (с солью) для входа
    private String digitalCertId;  // Ссылка на сертификат/ключ ЭЦП в отдельном защищенном хранилище
}

Аутентификация (вход) и подписание документа — это два независимых процесса, использующих разные механизмы.