Vérifier les signatures des webhooks

Vue d'ensemble #

Vérifiez les événements que Wooshpay envoie à vos points de terminaison webhook.

En-tête de signature Wooshpay #

Le Wooshpay-Signature inclus dans chaque événement signé contient un horodatage et une signature.

L'horodatage est préfixé par t=et chaque signature est préfixée par v1.

Par exemple :

Wooshpay-Signature:t=1492774577,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4

Clé secrète du webhook #

Wooshpay génère un clé secrète pour chaque webhook. whsec_

Avant de vérifier les signatures, vous devez récupérer le secret de votre webhook à partir de webhook.secret dans l'objet webhook.

clé secrète du webhook

Vérification des signatures #

En comparant les signature dans l'en-tête à la signature attendueVous pouvez vérifier que les messages ont été envoyés par Wooshpay et non par un tiers.

Pour vérifier la signature étape par étape, vous pouvez suivre le guide ci-dessous :

Étape 1 : Extraire l'horodatage et les signatures de l'en-tête #

Fractionner l'en-tête, en utilisant la fonction , comme séparateur, pour obtenir une liste d'éléments. Il faut ensuite diviser chaque élément, à l'aide de la fonction = comme séparateur, pour obtenir une paire préfixe/valeur.

La valeur du préfixe t correspond à l'horodatage, et v1 correspond à la signature. Vous pouvez écarter tous les autres éléments.

Par exemple :

t=1687845304,v1=6fdfb9c357542b8ee07277f5fca2c6f728bae2dce9be2f91412f4de922c1bae4

Étape 2 : Préparer le charge de paiement signée chaîne de caractères #

Le charge de paiement signée est créée par concaténation :

  • L'horodatage (sous forme de chaîne de caractères)
  • Le personnage .
  • La charge utile JSON proprement dite (le corps de la demande)

Par exemple :

1687845304+.+Charge utile JSON

1687845304.{
  "id" : "evt_1NNUrjL6kclEVx6Mb1x5dKJ3",
  "object" : "event",
  "api_version" : "2022-11-15",
  "created" : 1687845303,
  "data" : {
    "object" : {
      "id" : "prod_O9oUVgsSaordCT",
      "objet" : "produit",
      "active" : true,
      "livemode" : true,
      "name" : "test",
      "type" : "service",
  "livemode" : true,
  "pending_webhooks" : 1,
  "type" : "product.created"
}

Étape 3 : Déterminer la signature attendue #

Calculer un HMAC avec la fonction de hachage SHA256.

  • Utilisez le secret du webhook du point de terminaison comme valeur de l'attribut cléque vous pouvez obtenir auprès de webhook.secret dans l'objet webhook
  • Utiliser le charge de paiement signée en tant que chaîne de caractères message que vous avez déjà préparé à l'étape 2.

Grâce à la clé + messagevous pouvez calculer une chaîne HMAC, qui est signature attendue

Par exemple :

 public static void main(String[] args) {
        String webhookSecret = "whsec_261V2mfsXt1BsOjJbHaQOxnTzhWZKrUE" ;
        String timestamp = "1687845304" ;
        String requestBody = "{\"id\":\"evt_1NNUrjL6kclEVx6Mb1x5dKJ3\",\"object\":\"event\",\"api_version\":\"2022-11-15\",\"created\":1687845303,\"data\":{\"object\":{\"id\":\"prod_O9oUVgsSaordCT\",\"object\":\"product\",\"active\":true,\"livemode\":true,\"name\":\"test\",\"type\":\"service\",\"livemode\":true,\"pending_webhooks\":1,\"type\":\"product.created"}" ;
        String signedPayload = timestamp+". "+requestBody ;
        String signature = hmacSha256(webhookSecret,signedPayload) ;
        String WooshpaySignature = "t="+timestamp+",v1="+signature ;
    }

    /**
     * HMAC-SHA256
     */
    public static String hmacSha256(String secret, String message) {
        Chaîne res ;
        try {
            Mac mac = Mac.getInstance("HmacSHA256") ;
            SecretKey secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256") ;
            mac.init(secretKey) ;
            byte[] hash = mac.doFinal(message.getBytes()) ;
            res = Hex.encodeHexString(hash) ;
        } catch (Exception e) {
            renvoie null ;
        }
        return res ;
    }

Étape 4 : Comparer les signatures #

Comparez les signature dans l'en-tête à la signature attendue.

Pour une correspondance d'égalité, calculez la différence entre le l'heure actuelle et le horodatage de la réceptionEnsuite, décidez si la différence est dans les limites de votre tolérance.

Pour vous protéger contre les attaques temporelles, vous pouvez utiliser une comparaison de chaînes à temps constant pour comparer la signature attendue à chacune des signatures reçues.

Quels sont vos sentiments ?
Mise à jour le 5 août 2023