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

花韻仙語
发布: 2024-12-01 08:30:09
原创
860人浏览过

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("\n", $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签名及验签?的详细内容,更多请关注php中文网其它相关文章!

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
相关标签:
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号