开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第八天
1、签名验证
1、在我们获取的时候有两种形式 ,配合我上一篇 PHP数据加密 使用AES和RSA方式 解密
2、示例代码
//获取请求的返回消息进行解密
function request_decode($params,$data)
{
if (is_string($params)) {
$params = json_decode($params, true);
}
//判断是否存在sign
if (empty($params['sign'])) {
return 'sign不存在';
}
//获取java返回的sign 然后去除数组sign 进行校验
$sign = $params['sign'];
unset($params['sign']);
//验签
$checkSign = $this->checkSign($sign,$params);
if(!$checkSign){
return '签名校验失败';
}
//解密业务参数 key 最开始生成的 16为AES秘钥(可查看上一篇文章)
//由于最开始就是用AES 加密的 解密同样的操作
$bizContent = $this->aes_decode($params['data'], $data['key']);
return $bizContent;
}
/**
*验证签名
*sign 对方公钥rsa解密 =》params生成签名 =》 对比sign解密后内容和params签名
* @param string $sing 签名
* @param array $params 密文数组
* @param string $public_key rsa对方公钥
*$return string $sign 签名
*/
function checkSign($sign, $params)
{
//公有数据
$PublicKey = $this->getPublicKey($this->otherPublicKey,2);
//因为是用的ASC的原签数据格式所以先吧数组组合好
$checksign = $this->sybAscii($params);
//用返回的sign和原签字符串进行校验 就可以得到校验是否正常的结果
$success = openssl_verify($checksign,base64_decode($sign),$PublicKey,OPENSSL_ALGO_SHA256);
if ($success === -1) {
echo "报错信息".openssl_error_string();
return false;
} elseif ($success === 1) {
return true;
}
return false;
}
//ASCII 加密码
//数组升序排序 =》用&和=拼装成 a=1&b=3&c=ddd格式
function sybAscii($postData){
$postData = array_filter($postData);
ksort($postData);
$string = [];
foreach ($postData as $key=>$val){
$string[] = $key."=".$val;
}
return implode("&",$string);
}
3、总结 对接数据解密和验签还是挺繁琐的,不过如果第一次走通了就很好理解了,主要是要明白加密和解密的用的算法,如果对算法不明白一定要明白之后在请求 不然头发不一定在(不要问我怎么知道的),一般的rsa请求加密生成 sign的时候都是 SHA256withRSA ,不过还是看对接文档里面的数据算,一定要问清楚,加密和解密是很重要的一部分,特别是在验签的时候,一般这个验签有些不一定有用只是做一校验而已,看自己的代码逻辑处理