Я использую услугу обработки кредитных карт третьей стороны (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»