2010-05-28 6 views
3

J'utilise un service de traitement de cartes de crédit tiers (Paybox) qui, après une transaction réussie, redirige vers le site Web avec une signature dans l'URL comme mesure de sécurité pour empêcher les gens de manipuler des données. C'est censé prouver que la requête provenait de ce service. Donc, mon URL de succès ressemble à ceci:Comment vérifier une signature numérique avec openssl

/success.php?signature=[HUGE HASH]

Je ne sais pas où commencer à vérifier cette signature. Ce service fournit une clé publique, et je suppose que j'ai besoin de créer une clé privée, mais je ne sais pas grand-chose au-delà. Je suis assez bon avec linux, et je sais que je vais devoir exécuter quelques commandes openssl. J'écris le script de vérification en PHP, qui a aussi des fonctions natives openssl().

Si quelqu'un pouvait me pousser dans la bonne direction avec un pseudo code ou même un code fonctionnel, je serais très reconnaissant. Merci.

Répondre

1

Vous n'avez pas besoin de clé privée. La signature est faite avec la clé privée de Paybox, donc vous aurez seulement besoin de their public key, data they've signed et signature. Consultez leur documentation pour voir la partie des données qu'ils ont signée.

Le manuel PHP contient un exemple complet dans la documentation de openssl_verify.

+0

... mais méfiez-vous - données chiffrées est un flux binaire, ce qui est une valeur urlencoded - alors qu'il existe des normes pour changer la représentation des données, il y a de standard ** ** pour changer la représentation des données - vous avez besoin de Paybox pour fournir des détails explicites sur la façon de vérifier le hachage – symcbean

1

Vous pouvez utiliser openssl_verify(), l'exemple suivant est de Stiv @ php.net

<?php 
// $data is assumed to contain the data to be signed 

// fetch certificate from file and ready it 
$fp = fopen("path/file.pem", "r"); 
$cert = fread($fp, 8192); 
fclose($fp); 

// state whether signature is okay or not 
// use the certificate, not the public key 
$ok = openssl_verify($data, $signature, $cert); 
if ($ok == 1) { 
    echo "good"; 
} elseif ($ok == 0) { 
    echo "bad"; 
} else { 
    echo "ugly, error checking signature"; 
} 
?> 

Plus d'info sur openssl_verify() ici: http://nl.php.net/openssl_verify

Paybox dispose également d'un fichier zip disponible en téléchargement sur leur site "et des échantillons pour Explications vérifier signe numérique avec PAYBOX SYSTEM"

http://www1.paybox.com/telechargement_focus.aspx?cat=3

5

C'est mon code et ça marche pour moi. J'espère que je peux vous aider.

$sign = "28E5FA795590066E8402B529DB027B8D082A226BE6E53F80D41F763207A11EF9..."; // inline signature. I'm using SHA512 
$cert = "your certification"; // ------BEGIN..... END..---- 
$data = "text"; // 64 charactor for SHA512. It's raw data, not hashed data 
$pubkeyid = openssl_pkey_get_public($cert); 
$ok = openssl_verify($data, hex2bin($sign), $pubkeyid,OPENSSL_ALGO_SHA512); 
if($ok==1) return "Verify"; else return "Unverify"; 
+1

Cela fonctionne comme un charme! – ChenHuang

+0

La vérification peut-elle être effectuée avec du hachage? Je ne pourrais pas avoir des données de départ, qui a été haché plus tard. – Eugene

Questions connexes