Vérification des signatures
DiffHook signe chaque charge utile de webhook afin que vous puissiez vérifier qu'elle provient de nous et qu'elle n'a pas été falsifiée.
Comment ça marche
Chaque requête comprend un en-tête X-Signature contenant une signature HMAC-SHA256 du corps brut de la requête, préfixée par sha256=.
X-Signature: sha256=abc123def456...
Votre secret de signature est disponible dans Application → Paramètres → Clés API.
Vérification dans Node.js
Utilisez express.raw() pour capturer les octets du corps brut avant toute analyse JSON. Le calcul de la signature sur un objet resérialisé produira un hachage différent.
const crypto = require('crypto')
function verifySignature(rawBody, signature, secret) {
const expected = 'sha256=' + crypto
.createHmac('sha256', secret)
.update(rawBody) // raw Buffer — not JSON.stringify(req.body)
.digest('hex')
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected)
)
}
// Mount with express.raw() so req.body is the raw Buffer
app.post('/webhook', express.raw({ type: 'application/json' }), (req, res) => {
const signature = req.headers['X-Signature']
if (!signature || !verifySignature(req.body, signature, process.env.DIFFHOOK_SIGNING_SECRET)) {
return res.status(401).send('Invalid signature')
}
res.status(200).send('OK')
const event = JSON.parse(req.body)
// process event...
})
Vérification en Python
import hmac, hashlib, json
def verify_signature(body: bytes, signature: str, secret: str) -> bool:
expected = 'sha256=' + hmac.new(
secret.encode(),
body,
hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
Remarques importantes
- Utilisez toujours
crypto.timingSafeEqual(ou équivalent) pour empêcher les attaques chronométrées. - Calculez la signature à partir des octets bruts du corps de la requête, avant l'analyse JSON
- Si
X-Signatureest manquant, rejetez la demande
Rotation de votre secret de signature
Faites pivoter votre secret de signature dans Paramètres à tout moment. Après la rotation, les anciennes signatures échoueront : mettez à jour votre déploiement avant de révoquer l'ancien secret.