bi java lajp 和php_PHP SM2 国密算法与 CURL SSL 双向认证

最近在对接民生银行的电子账户接口,按照民生的要求,调用接口需要涉及 SM2 国密算法及 SSL 双向认证。目前银行端提供的只有 JAVA 版的 SDK,把 PHP 作为开发语言的我们表示很受伤。本文就针对涉及的两个点进行说明,简单汇总下 PHP 语言中的解决方案。

1、SM2 国密算法

针对接口请求参数的加密加签及响应数据的解密验签操作,民生银行的要求如下:对数据进行 PKCS#7 带原文签名,并将签名结果加密成 CMS 格式的数字信封。

SM2 算法,签名所采用的 HASH 算法为 SM3(带 Z 值),加密所采用的算法为 SM4_CBC ,SM2 加密格式为老国密标准 C1||C2||C3 。

所谓的数字信封,是一种综合利用了对称加密技术和非对称加密技术两者的优点进行信息安全传输的一种技术。数字信封既发挥了对称加密算法速度快、安全性好的优点,又发挥了非对称加密算法密钥管理方便的优点。

之前对接的平安银行电子账户接口中,对接口的参数安全处理,也是类似上面数字信封的概念。但是采用的对称加密算法为 AES( AES-256-CBC ),采用的非对称加密算法为 RSA2(2048 位秘钥,签名采用 SHA256 算法)。对于 AES 及 RSA 算法的实现,在 PHP 中还是非常方便的,使用 OPENSSL 相关函数即可。

至于民生要求的 SM2 国密相关算法,其实在 PHP 中目前没有太好的方案。经过各种搜索,我找到了这个看起来似乎是目前最优的解决方案: GMSSL ( http://gmssl.org/docs/php-api.html )。OpenSSL v1.1.1 新特性: 开始支持国密SM2/SM3/SM4加密算法(仅支持算法,未支持国密套件)

由于未对 OpenSSL 的的国密相关算法进行详细研究,暂不说明。

按照 GMSSL 的官方说明,首先进行编译安装,服务器系统是 CentOS ,基本很顺利就能安装完成。然后是重新编译 PHP ,按官方文档,需要用 GMSSL 中的文件替换 PHP 中的 ext/openssl ,然后再进行编译安装。整个编译过程报错很多,通过各种搜索和尝试,终于解决了。在这里不得不提一句,互联网上 GMSSL 与 PHP 相关的资料真的很少,基本找不到可以参考的有价值信息,除了官网的那个 PHP API 的简单说明。

经过各种尝试,由于对 PKCS#7 的数字信封的格式要求实在不熟悉,另外参考了银行 SDK 中的 JAVA 代码的封装,仍然无解。出于时间的考虑,暂时放弃。后续有时间了还是要详细研究一下,我想更多是因为自己对这块的基础知识不足导致的。

由于上面的原因,最终我很不情愿的决定采用 PHP 调用 JAVA 代码的方式,通过民生的 SDK 来实现加密加签和解密验签操作。目前 PHP 调用 JAVA 有两种现有的解决方案,都是作者很多年前开发的,很久未更新了(也完全没有更新的必要)。一种是 PHP-Java-Bridge ( http://php-java-bridge.sourceforge.net/pjb/ ),另外一种是 LAJP ( http://code.google.com/p/lajp/ )。因为民生的 Demo 中提供的是 LAJP 的方案,我进行了测试可以通过,另外就是这个相对于 PHP-Java-Bridge 更加的轻量级,因此就采用了这个方案,对代

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值