Возможная уязвимость при авторизации через ЭЦП (вопрос)

У меня крутится в голове уязвимость авторизации через ЭЦП.
Мой system design авторизации как у всех:

  1. Генерирую токен с бекенда для фронта
  2. Фронт подписывает этот токен с ключем AUTH с выходным форматом PEM, и отдает эту подпись на бэк
  3. Я на бекенде верифицирую PEM, ищу свой токен, и дальше получаю(GetCertFromCMS), проверяю(X509ValidateCertificate(cert, ValidateTypeOCSP, validatePath)) сам сертификат.

Так вот тут я смотрю на подпись от фронта и можно сказать открыто нахожу свой токен там. Что если злоумышленник просто возьмет любую другую подпись и поставит туда токен?

Я тестил это всё с заменой на любую другую подпись с новым токеном. Через VerifyData это не проходит. Но вдруг все таки пройдет когда то.

Как мне обезопасить бекенд? Или всё уже безопасно и я зря волнуюсь, и этот system design авторизации с токеном безопасен?

Добрый день! Если заменить подписанный токен на другой токен, то VerifyData не пройдет никогда. Извлекать данные из Attached подписи можно в любом случае.

Рахмет, понял, тогда всё значит супер.

Кстати имейте в виду что Вам стоит так же учитывать следующие вещи по поводу токена:

  • их нужно учитывать (то есть Ваш бекенд должен хранить реестр всех выпущенных токенов и если с фронта приходит подпись на неизвестный Вам токен, то выполнять аутентификацию нельзя, так как этот токен может быть краденным с другого сервиса);
  • у него должен быть ограниченной срок жизни (то есть не стоит выполнять аутентификацию по токену, который Ваш сервис сформировал несколько месяцев назад, так как токен может быть краденным - злоумышленник мог получить его из сетевого дампа или журналов);
  • каждый токен можно использовать только один раз (чтобы злоумышленник не смог повторно отправить уже использованную для аутентификации подпись).

Рахмет за совет! У меня всё так и сделано по сути. Вот мой System design авторизации через ЭЦП:

  1. Фронт дает запрос на бекенд, чтобы получить уникальный токен.
  2. Я на бекенде формирую UUID, и храню его в Redis на 10 минут (после 10 минут, он сам удалится). Потом отправляю этот токен на фронт.
  3. Фронт подписывает AUTH ключем этот токен через NCALayer, и отправляет подпись мне на бекенд.
  4. Я получаю эту подпись на бекенде. Проверяю PEM подпись, потом проверка сертификата по OCSP. Потом смотрю на этот токен в подписе, мой ли он, если не мой то блочу авторизацию. Если мой то удаляю его c Redis’a и авторизую пользователя.

Этот System Design нашел на этом форуме. Помоему все нормально и под ваши 3 пункта подходит. Отпишите потом пожалуйста

Да, выглядит хорошо.

1 Симпатия