* 生成待签名的字符串
* @param $data 参与签名的参数数组
* @return string 待签名的字符串
*/
function getSignStr($data)
{
//排序
ksort($data);
//剔除sign 如果对方的签名叫sign 或者可以在调用方法的时候剔除
//unset($data['sign']);
$stringToBeSigned = '';
$i = 0;
foreach ($data as $k => $v) {
if ($i == 0) {
$stringToBeSigned .= "$k" . "=" . "$v";
} else {
$stringToBeSigned .= "&" . "$k" . "=" . "$v";
}
$i++;
}
return $stringToBeSigned;
}
* 生成签名
* @param array $params 待签名的所有参数
* @return string 生成的签名
*/
function getSignGenerator($params)
{
//生成待验签的字符串
$data = $this->getSignStr($params);
//私钥的内容 一行的格式
$privateKey = 'xxx';
$pem = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($privateKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
//openssl_private_encrypt($data, $crypted, $pem);
openssl_sign($data, $sign, $pem, OPENSSL_ALGO_SHA256);
$sign = base64_encode($sign);
return $sign;
}
验证签名
* 验证签名
* @param array $params 待签名的所有参数
* @param string $sign 生成的签名
* @return boolean 校验的结果
*/
function signCheck($params, $sign)
{
//生成待验签的字符串
$data = $this->getSignStr($params);
//对方的公钥内容 一行的形式
$publicKey = 'xxx';
$pem = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($publicKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
$checkResult = (bool)openssl_verify($data, base64_decode($sign), $pem, OPENSSL_ALGO_SHA256);
return $checkResult;
}
* 我们自己的加密
* @param $str 待加密的字段
* @return string
*/
function encrypt($string)
{
//公钥内容 一行的形式
$pubKey = 'xxxx';
$res = "-----BEGIN PUBLIC KEY-----\n" .
wordwrap($pubKey, 64, "\n", true) .
"\n-----END PUBLIC KEY-----";
openssl_public_encrypt($string, $encrypt, $res);
return base64_encode($encrypt);
}
* 我们自己的解密
* @param $secret 加密后的base64字段
* @return string
*/
function decrypt($secret)
{
//私钥内容 一行的形式
$privateKey = 'xx';
$res = "-----BEGIN RSA PRIVATE KEY-----\n" .
wordwrap($privateKey, 64, "\n", true) .
"\n-----END RSA PRIVATE KEY-----";
openssl_private_decrypt(base64_decode($secret), $oldData, $res);
return $oldData;
}