Hello! 欢迎来到小浪资源网!


PHP中如何实现PKCS7Signature签名及验签?


PHP中如何实现PKCS7Signature签名及验签?

pkcs7signature php实现解读

在对接第三方接口时,需要用到pkcs7signature加签验证,那么如何在php中实现这个功能呢?

php中可以使用openssl_pkcs7_verify函数进行验签,最后一个参数需要设置成832。另外,需要对请求数据进行升序排序(asort($argarr, sort_string)),才能保证加签后的值和Java端一致。

具体实现代码如下:

立即学习PHP免费学习笔记(深入)”;

    /**      * 加签      * @param string $str 字符串(sortSign($argArr))      * @param string $pre 生成文件干扰字符串UID      * @return string      */     public static function pkcs7Sign($str, $pre = 'tmp')     {         $pre    = uniqid($pre);         $pkcs12 = file_get_contents('PTNRtest.pfx');         openssl_pkcs12_read($pkcs12, $certs, 'mima');         $dataFile = RUNTIME_PATH . $pre . 'dataTxt.txt';         $myfile = fopen($dataFile, "w") or die("Unable to open file!");//将要签名的参数写入文件中         fwrite($myfile, $str);         fclose($myfile);         $signFile = RUNTIME_PATH . $pre . 'sign.txt';         openssl_pkcs7_sign($dataFile, $signFile, $certs['cert'], $certs['pkey'], null, PKCS7_DETACHED | 0x200 | 0x100);         $sign = self::smimeToSign(file_get_contents($signFile));         unlink($dataFile);         unlink($signFile);         return $sign;     }      /**      * 把S/MIME格式数据格式成签名数据      * @param string $smime S/MIME格式数据      * @return string      */     public static function smimeToSign($smime)     {         $prefix  = "||";         $smime   = str_replace(" ", $prefix, trim($smime));         $tmpData = [];         preg_match_all("/|{4}(.*)|{4}/Ui", trim($smime), $tmpData);         if (isset($tmpData[1][1])) {             $smime = str_replace("||", "", $tmpData[1][1]);         } else {             $smime = "";         }         return $smime;     }      /**      * 加签数据值升序      * @param array $argArr 请求数据      * @return string      */     public static function sortSign($argArr)     {         $tmp = [];         foreach ($argArr as $key => $val) {             if (in_array($key, ['SIGN_INFO'])) continue;             $tmp[] = $val;         }         asort($tmp, SORT_STRING);         return implode('', $tmp);     }

相关阅读