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