php 生成签名及验证签名详解
php生成签名及验证签名
<?php
/**
*根据原文生成签名内容
*
*@paramstring$data原文内容
*
*@returnstring
*@authorconfu
*/
functionsign($data)
{
$filePath='test.p12';
if(!file_exists($filePath)){
returnfalse;
}
$pkcs12=file_get_contents($filePath);
if(openssl_pkcs12_read($pkcs12,$certs,'读取证书所需要的密码')){
$privateKey=$certs['pkey'];//根据实际情况键值可能不同
$publicKey=$certs['cert'];//根据实际情况键值可能不同
$binary_signature="";
if(openssl_sign($data,$binarySignature,$privateKey,OPENSSL_ALGO_SHA1)){
return$binarySignature;
}else{
return'';
}
}else{
return'';
}
}
/**
*验证签名自己生成的是否正确
*
*@paramstring$data签名的原文
*@paramstring$signature签名
*
*@returnbool
*@authorconfu
*/
functionverifySign($data,$signature)
{
$filePath='test.p12';
if(!file_exists($filePath)){
returnfalse;
}
$pkcs12=file_get_contents($filePath);
if(openssl_pkcs12_read($pkcs12,$certs,'读取证书所需要的密码')){
$publicKey=$certs['cert'];
$ok=openssl_verify($data,$signature,$publicKey);
if($ok==1){
returntrue;
}
}
returnfalse;
}
/**
*验证返回的签名是否正确
*
*@paramstring$data要验证的签名原文
*@paramstring$signature签名内容
*
*@returnbool
*@authorconfu
*/
functionverifyRespondSign($data,$signature)
{
$filePath='allinpay-pds.pem';
if(!file_exists($filePath)){
returnfalse;
}
$fp=fopen($filePath,"r");
$cert=fread($fp,8192);
fclose($fp);
$pubkeyid=openssl_get_publickey($cert);
if(!is_resource($pubkeyid)){
returnfalse;
}
$ok=openssl_verify($data,$signature,$pubkeyid);
if($ok==1){
openssl_free_key($pubkeyid);
returntrue;
}
returnfalse;
}
?>
openssl_sign默认signature_alg参数是OPENSSL_ALGO_SHA1
如果使用DSA加密方式需要使用OPENSSL_ALGO_DSS1参数
signature_alg其他参数
OPENSSL_ALGO_DSS1(integer)
OPENSSL_ALGO_SHA1(integer)
OPENSSL_ALGO_SHA224(integer)
OPENSSL_ALGO_SHA256(integer)
OPENSSL_ALGO_SHA384(integer)
OPENSSL_ALGO_SHA512(integer)
OPENSSL_ALGO_RMD160(integer)
OPENSSL_ALGO_MD5(integer)
OPENSSL_ALGO_MD4(integer)
OPENSSL_ALGO_MD2(integer)
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!