Контроль целостности данных

В системе может быть использован механизм защиты данных от внешних воздействий. Защита реализуется путём подписи запроса и проверки подписи ответа.

Со стороны мерчанта подпись осуществляется приватным ключом, на стороне платформы — проверка происходит публичным ключом. В свою очередь, данные ответа сервера подписываются публичным ключом, а проверка на стороне мерчанта осуществляется приватным ключом.

1. Подпись запроса

Для подписи данных необходимо сформировать сумму всех значений тела запроса и подписать её приватным ключом.
Алгоритм формирования строки для подписи:

  1. Рекурсивно извлеките все скалярные значения из тела запроса.
    Сортируйте пары (ключ, значение) по имени ключа.
    Если имена равны — приоритет у более глубоких уровней.
  2. Конкатенируйте все значения без разделителей.
  3. Вычислите SHA‑256 хэш строки и представьте его в Base64 кодировке, полученную строку необходимо передать в заголовке, в параметре x-digest.
  4. Подпишите полученные данные приватным ключом (формат PKCS1v15 и SHA256). Полученную строку необходимо передать в заголовке, в параметре x-signature в base64‑формате https://cryptography.io/en/3.4.7/hazmat/primitives/asymmetric/rsa.html#signing
  5. Передайте локальный хэш в Header HTTPS запроса как значение x-digest, подписанный хэш - как значение x-signature.

2. Проверка подлинности ответа

При проверки целостности ответа используется похожий алгоритм проверки что и при формировании подписи запроса, за исключением того, что подпись формирует сервер на основе публичного ключа, а ответ проверяет клиент на основе приватного ключа. Так же отличия есть в способе валидации. Для проверки целостности выполняется расшифровка сообщения с помощью приватного ключа:

  1. Рекурсивно извлеките все скалярные значения из тела запроса. Сортируйте пары (ключ, значение) по имени ключа. Если имена равны — приоритет у более глубоких уровней.
  2. Конкатенируйте все значения без разделителей.
  3. Вычислите SHA‑256 хэш строки и представьте его в HEX-STRING‑кодировке.
  4. Расшифруйте с помощью приватного ключа строку полученную из заголовка ответа в параметре x-signature.
  5. Сравните полученные строки из п.3 и п.4.

Note

Для промежуточного контроля можно сравнивать строку из заголовкаx-digest с строкой полученной в п.3. Для контроля целостности его не следует использовать, только для промежуточной валидации корректности конкатенации строк.