PHP 数据签名验证及业务参数解密

149 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 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 ,不过还是看对接文档里面的数据算,一定要问清楚,加密和解密是很重要的一部分,特别是在验签的时候,一般这个验签有些不一定有用只是做一校验而已,看自己的代码逻辑处理