Php 如何使用openssl验证数字签名

Php 如何使用openssl验证数字签名,php,security,openssl,digital-signature,Php,Security,Openssl,Digital Signature,我使用的是第三方信用卡处理服务(Paybox),在交易成功后,它会将URL中的签名重定向回网站,作为一种安全措施,以防止人们操纵数据。它应该证明请求来自此服务。因此,我的成功URL如下所示: /php?签名=[大哈希] 我不知道从哪里开始验证这个签名。这个服务确实提供了一个公钥,我假设我需要创建一个私钥,但除此之外我知道的不多 我对linux很在行,我知道我必须运行一些openssl命令。我正在用PHP编写验证脚本,它也有原生的openssl()函数 如果有人能用一些伪代码,甚至是函数代码,把我

我使用的是第三方信用卡处理服务(Paybox),在交易成功后,它会将URL中的签名重定向回网站,作为一种安全措施,以防止人们操纵数据。它应该证明请求来自此服务。因此,我的成功URL如下所示:

/php?签名=[大哈希]

我不知道从哪里开始验证这个签名。这个服务确实提供了一个公钥,我假设我需要创建一个私钥,但除此之外我知道的不多

我对linux很在行,我知道我必须运行一些openssl命令。我正在用PHP编写验证脚本,它也有原生的openssl()函数


如果有人能用一些伪代码,甚至是函数代码,把我推向正确的方向,我将非常感激。谢谢。

您不需要任何私钥。签名使用Paybox的私钥进行,因此您只需要
他们的公钥
、他们签名的
数据
签名
。检查他们的文档,查看他们已签署的数据的哪一部分

PHP手册的文档中包含一个完整的示例。

您可以使用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()的详细信息,请参见:

Paybox还有一个zip文件,可在其网站“使用Paybox系统检查数字签名的说明和示例”上下载


这是我的代码,对我来说很有用。希望我能帮助你

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

…但请注意-加密数据是一个二进制流,这是一个urlencoded值-虽然有更改数据表示形式的标准,但也有更改数据表示形式的标准-您需要Paybox提供如何验证哈希的明确细节可以使用哈希进行验证?我可能没有起始数据,这是后来散列的。