Java библиотека
Проверяем подпись входящего webhook на Java!
Сначала сверяем HMAC-подпись провайдера с исходными байтами тела, а уже после проверки разбираем JSON.
Считаем ожидаемую подпись от сырого тела запроса:
Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(secret, "HmacSHA256"));
byte[] expected = mac.doFinal(rawBody);
Секрет передаётся в байтах, а rawBody сохраняется без повторной сериализации. Даже изменение пробелов в JSON меняет HMAC, поэтому проверять нужно именно те байты, которые подписал отправитель.
Декодируем hex из заголовка и сравниваем подписи:
byte[] supplied = HexFormat.of().parseHex(header);
boolean valid = MessageDigest.isEqual(
expected, supplied);
MessageDigest.isEqual предназначен для сравнения секретных значений без раннего выхода по первому несовпавшему байту. Неверный формат заголовка нужно отдельно считать невалидной подписью, а не продолжать обработку запроса.
Принимаем только корректный заголовок:
try {
return verify(rawBody, secret, header);
} catch (IllegalArgumentException error) {
return false;
}
До успешной проверки не запускаем логику и не сохраняем событие. Дополнительно проверяем защиту от повторной доставки по идентификатору события.
Java Библиотека | Мы в Телеграм Если у вас установлено приложение,
вы можете сразу перейти в канал