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

> Хеш с ключом, который доказывает, что вебхук пришёл от платформы и не изменён. Как проверить заголовок X-Signature от CryptoLike по сырому телу запроса.

Source: https://cryptolike.net/ru/glossary/webhook-signature
Updated: 2026-09-25

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

## Как это работает в 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 проверяют вебхук одним вызовом — со сравнением за постоянное время и допуском по времени; тестовые векторы, включая запросы, которые проверка обязана отклонить, опубликованы вместе с [контрактом вебхуков](https://cryptolike.net/ru/docs/webhooks). Запросы к API подписываются в обратную сторону — вашим API-ключом, см. [аутентификацию API](https://cryptolike.net/ru/docs/auth).

## Пример

Проверке подписи 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)
```
