Как проверить цифровую подпись с помощью openssl

Я использую услугу обработки кредитных карт третьей стороны (Paybox), которая после успешной транзакции перенаправляет обратно на сайт с подписью в URL как меру безопасности, чтобы люди не манипулировали данными. Он должен доказать, что запрос возник из этой службы. Таким образом, мой URL-адрес успеха выглядит примерно так:

/success.php?signature=[HUGE HASH]

Я не знаю, с чего начать с проверки этой подписи. Эта услуга предоставляет открытый ключ, и я предполагаю, что мне нужно создать закрытый ключ, но я не знаю многое из этого.

Я очень хорошо разбираюсь в Linux, и я знаю, что мне нужно будет запустить некоторые команды openssl. Я пишу скрипт проверки в PHP, который также имеет собственные функции openssl ().

Если бы кто-нибудь мог прогнать меня в правильном направлении с помощью какого-то псевдокода или даже функционального кода, я был бы очень благодарен. Благодарю.

Это мой код, и это работает для меня. Надеюсь, я могу вам помочь.

$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"; 

Вам не нужен секретный ключ. Подпись создается с помощью личного ключа Paybox, поэтому вам нужен только their public key , data they've signed и signature . Проверьте их документацию, чтобы узнать, какую часть данных они подписали.

Руководство по PHP содержит полный пример в документации openssl_verify .

Вы можете использовать openssl_verify (), следующий пример из 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"; } ?> 

Подробнее о openssl_verify () здесь: http://nl.php.net/openssl_verify

Paybox также имеет zip-файл, доступный для загрузки на их сайте «Объяснения и образцы для проверки цифрового знака с помощью PAYBOX SYSTEM»

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