PHP中如何实现PKCS7Signature签名及验签?
时间:2024-12-6 21:05 作者:emer 分类: 无

pkcs7signature php实现解读
在对接第三方接口时,需要用到pkcs7signature加签验证,那么如何在php中实现这个功能呢?
php中可以使用openssl_pkcs7_verify函数进行验签,最后一个参数需要设置成832。另外,需要对请求数据进行升序排序(asort($argarr, sort_string)),才能保证加签后的值和java端一致。
具体实现代码如下:
立即学习“”;
/**
* 加签
* @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);
} 登录后复制
以上就是PHP中如何实现PKCS7Signature签名及验签?的详细内容,!