Home .NET Vérification signature Paybox en .Net

Vérification signature Paybox en .Net

  Maxime B. 5 min 18 juillet 2012

Introduction

Dans le cadre du développement d’un site Internet en technologie .Net et CMS Umbraco, nous avons mis en place la solution Paybox pour le paiement en ligne. L’intégration proposée par Paybox avec la technologie .Net n’était pas satisfaisante et nous avons rencontré des soucis pour extraire une clé publique contenue dans un fichier de type « .pem ».

Cette clé est obligatoire afin de pouvoir comparer les données retournées par Paybox et une signature de vérification.

Cette signature nous permet de vérifier que les données n’ont pas été modifiées entre l’envoi par la plateforme et la réception sur le serveur de production.

Nous avons mis en place notre propre solution (après quelques échanges avec Paybox), qui passe par une classe « OpenSSLKey » afin de charger notre fichier « .pem » puis le lancement de la comparaison entre les données et la signature.

Les détails techniques de la solution sont expliqués ci-après.

 

Ce dont nous avons besoin

  • Avant tout développement, il faut récupérer sur le site de Paybox la clef publique (au format « .pem ») qui nous permettra de décrypter la signature de retour.
  • Le Framework .Net propose des solutions de vérification de signature. Cependant, il n’existe pas de manière « directe » de charger une clef publique au format « .pem ». La classe « opensslkey », trouvable à cette adresse http://csslab.s3.amazonaws.com/csslabs/Siva/opensslkey.cs, permet de charger ce fichier « .pem ». Nous allons par la suite implémenter la vérification des données.

Implémentation

Créer un nouveau projet (par exemple OpenSSLKey » de type application console sous Visual Studio.

Modifier le fichier « Program.cs » et y copier l’intégralité de la classe « OpenSSLKey ».

Modifier le « Main » afin d’ajouter la lecture automatique du fichier « .pem ».

//String filename = Console.ReadLine().Trim();
string filename = @"C:\Temp\pubkey.pem";

Modifier la méthode  « DecodePEMKey » afin d’y inclure la signature et les données à vérifier :

  • On récupère la signature reçue par Paybox, et on la convertie en tableau de Bytes :
// Signature reçue par Paybox encodée en base 64.
var signature = "npArYMsKpBYQ3XFyouN32Q1Z5/HxEpXCiYrjks6ZQD8RPFfoJ4hEVnm1WD7tDCvEkSawAfyaN3jUG7tHjc3NR1gnjoZREz3LSjsr128GUGmRZpF1uV3vG6NqHzWf2TiZMUttQH8yMBBb6XsIv1I5h6S0K6EZzt2SB4dp7AfyHR0=";

// On converti cette signature en tableau de Bytes
byte[] bSignature = Convert.FromBase64String(signature);

  • On récupère les données reçues par Paybox, on les converties en tableau de bytes et on hash le tout :
// Données reçues par Paybox.
var data = "montant=500&ref=634762387633462156_1329&auto=XXXXXX&trans=405476423&erreur=00000&idtrans=406494010&abonnement=0";
var sha = new SHA1CryptoServiceProvider();

// On converti en tableau de Bytes le résultat du hash des données.
byte[] hash = sha.ComputeHash(Encoding.UTF8.GetBytes(data));

  • Enfin on appelle la méthode « VerifyHash() qui va permettre de vérifier la correspondance entre la signature et les données, le tout avec l’algorithme « SHA1 » :
// On vérifie les données et la signature avec la methode « VerifyHash » en passant le système « SHA1 ».
var hasValidSig = rsa.VerifyHash(hash, CryptoConfig.MapNameToOID("SHA1"), bSignature);

// Affiche le résultat de la verification.
Console.WriteLine("Hash vérifié : " + hasValidSig.ToString());

La console affiche le résultat de la comparaison des données.

Notre avis

Il est dommage que le Framework .Net ne propose pas nativement la lecture de fichier « .pem » à l’instar du PHP ou encore du Java.

Grâce à cette librairie, nous pouvons enfin mettre facilement en place une vérification de paiement pour la plateforme « Paybox » en .Net. Son utilisation est facile et intuitive.

 

 

 

 

Lire les articles similaires

Laisser un commentaire

Social Share Buttons and Icons powered by Ultimatelysocial