如何使用openssl验证数字签名

时间:2010-05-28 04:49:39

标签: php security openssl digital-signature

我正在使用第三方信用卡处理服务(Paybox),该服务在成功交易后,重定向回网站,并在URL中使用签名作为安全措施,以防止人们操纵数据。它应该证明请求源自此服务。所以我的成功URL看起来像这样:

/success.php?signature= [HUGE HASH]

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

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

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

3 个答案:

答案 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 keydata they've signedsignature。检查他们的文档,看看他们签署了哪些数据。

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检查数字签名的说明和样本”

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