К содержимому

Словарь

Подпись вебхука

Хеш с секретным ключом в заголовке запроса, который доказывает, что событие отправил владелец общего секрета и что тело не изменили по дороге.

Как это работает в CryptoLike

CryptoLike подписывает каждый вебхук секретом вашего endpoint: X-Signature — это sha256= и hex-строка HMAC-SHA256 от X-Timestamp, точки и сырого тела запроса. Ваш сервер вычисляет то же значение, сравнивает его за постоянное время и отклоняет запрос, если значения не совпали или X-Timestamp расходится с его часами больше чем на 300 секунд в ту или другую сторону, — так перехваченный запрос нельзя отправить повторно.

Проверяйте сырые байты в том виде, в каком они пришли, а не заново сериализованный JSON: порядок ключей и пробелы могут отличаться от того, что выдаст ваш парсер. Повтор события приходит с тем же телом, но с новыми X-Timestamp и X-Signature. Секрет генерируется за вас (64 hex-символа) или задаётся вами (16–256 печатных ASCII-символов без пробелов); он показывается один раз — при создании и при ротации, хранится только на вашем сервере и в любой момент меняется в кабинете.

SDK CryptoLike для TypeScript, Python, Go и PHP проверяют вебхук одним вызовом — со сравнением за постоянное время и допуском по времени; тестовые векторы, включая запросы, которые проверка обязана отклонить, опубликованы вместе с контрактом вебхуков. Запросы к API подписываются в обратную сторону — вашим API-ключом, см. аутентификацию API.

Пример

Проверке подписи CryptoLike нужны четыре значения: секрет endpoint, заголовок X-Timestamp, сырые байты тела и заголовок X-Signature. На Python это несколько строк стандартной библиотеки; вызывайте проверку до того, как разбирать или сохранять событие, и отвечайте ошибкой на неверную подпись или устаревшую метку времени:

python
import hmac, hashlib

def verify(secret: str, timestamp: str, raw_body: bytes, signature: str) -> bool:
    expected = "sha256=" + hmac.new(secret.encode(), f"{timestamp}.".encode() + raw_body, hashlib.sha256).hexdigest()
    return hmac.compare_digest(expected, signature)

В документации →

Связанные термины

Читать дальше

Начните с тестового платежа

Создайте аккаунт, попросите у поддержки доступ к тестовой среде и посмотрите, как платёж проходит путь от pending до paid в тестовой сети.