我正在使用第三方信用卡处理服务(Paybox),该服务在成功交易后,重定向回网站,并在URL中使用签名作为安全措施,以防止人们操纵数据。它应该证明请求源自此服务。所以我的成功URL看起来像这样:
/success.php?signature= [HUGE HASH]
我不知道从哪里开始验证此签名。这项服务确实提供了一个公钥,我认为我需要创建一个私钥,但除此之外我不太了解。
我对linux非常好,我知道我必须运行一些openssl命令。我正在用PHP编写验证脚本,它也有本机openssl()函数。
如果有人能用一些伪代码甚至功能代码向我推进正确的方向,我将非常感激。感谢。
答案 0 :(得分:5)
这是我的代码,它对我有用。希望我能帮到你。
$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 :(得分:1)
您不需要任何私钥。签名是使用Paybox的私钥进行的,因此您只需要their public key
,data they've signed
和signature
。检查他们的文档,看看他们签署了哪些数据。
PHP手册包含openssl_verify文档中的完整示例。
答案 2 :(得分:1)
您可以使用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检查数字签名的说明和样本”