首先在centos上生成公钥和私钥
确保openssl已安装
#yum install openssl #yum install openssl-devel
#openssl
##进入OpenSSL程序OpenSSL>
genrsa -out rsa_private_key.pem 1024
##生成私钥OpenSSL>
rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
##生成公钥
OpenSSL>
exit
##退出OpenSSL程序
PHP必须先开启openssl扩展库支持
$data=array(1,2,3); //data可任意数据格式
//签名函数,rsaPrivateKeyFilePath私钥路径
function data_sign($data,$rsaPrivateKeyFilePath) {
//读取私钥文件
$priKey = file_get_contents($rsaPrivateKeyFilePath);
///转换为openssl格式密钥
$res = openssl_get_privatekey($priKey);
//签名需要把数组转换成字符串
$data=getSignContent($data);
//签名
openssl_sign($data, $sign, $res);
//释放资源
openssl_free_key($res);
//转码
$sign = base64_encode($sign);
return $sign;
}
//验证签名rsaPublicKeyFilePath公钥路径
function data_verify($data, $sign, $rsaPublicKeyFilePath) {
//读取公钥文件
$pubKey = file_get_contents($rsaPublicKeyFilePath);
//转换为openssl格式密钥
$res = openssl_get_publickey($pubKey);
//转换成字符串
$data=getSignContent($data);
//调用openssl内置方法验签,返回bool值
$result = (bool)openssl_verify($data, base64_decode($sign), $res);
//释放资源
openssl_free_key($res);
return $result;
}
//数组转换成字符串,需要开启mbstring扩展供mb_convert_encoding函数使用
function getSignContent($params) {
ksort($params);
$stringToBeSigned = "";
$i = 0;
foreach ($params as $k => $v) {
if (false === empty($v) && "@" != substr($v, 0, 1)) {
// 转换成目标字符集
$v = mb_convert_encoding($v, 'UTF-8');
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
}
unset ($k, $v);
return $stringToBeSigned;
}