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)
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!