背景
最近要调用一个国企接口,签名计算使用的国密3摘要计算算法(sm3),不过php没有原生支持该算法的函数。
尝试1-使用PHP类库实现
利用composer安装第三方php类库实现该方法。
使用了OneSm 类库,速度蛮快,但是不知为何得到的结果总是错的,无奈放弃。
使用了SM3-PHP类库,测试后可以使用,但由于计算签名的字符串较长,PHP执行效率等多个原因,使用该方法速度较慢,无奈只能作为备选方案。
几KB情况,勉强能用,但是几十KB时php直接500超时,计算奔溃。。。
尝试2-使用PHP的OpenSSL扩展实现
openssl在1.1.1版本中支持了国密算法,这让我想起了php的openssl扩展,于是就开始尝试使用openssl进行sm3计算。
由于我的系统内置的openssl是1.0.2k,版本比较老,所以需要升级。同时升级openssl也牵扯到对php中openssl扩展的升级。。。
腾讯云的资料显示:同步不建议编译安装升级原因
1) 源码编译安装升级风险
新装的OpenSSH因端口冲突无法正常启动, 要实现原地替换较为复杂且容易出错。
替换了系统自带的OpenSSL动态库,产生兼容性问题,造成 安装后系统无法正常启动和登录
原有程序无法自动链接到新版本,造成 修复无效 。
因此,从系统可靠性,操作危险性,可维护性等方面考虑,不建议非专业人员自行编译安装升级OpenSSH/OpenSSL等组件。
2) 没有必要升级到上游最新版本
各主流Linux发行版如RHEL/CentOS等,会以某个OpenSSH/OpenSSL的子版本为基础作为长期稳定版单独维护,当上游社区出现重大安全漏洞补丁时,他们会反向移植回来完成修复。所以,出于修复漏洞的目的,并没有必要升级对应软件到上游的最新版本,只需要使用发行版自带的包管理工具如apt/yum升级到最新版本即可。
例如:CVE-2022-2068对应的漏洞在上游OpenSSL 1.0.2zf/1.1.1p/3.0.4 版本后修复,但CentOS 7中自带的openssl-1.0.2k不受影响,CentOS 8 Stream中自带的openssl-1.1.1k-7完成了修复,并不需要升级到1.1.1p或者是3.0.4
最后-使用PHP的c语言编译的ZEND扩展实现。
其实,openssl下sm3加密速度已经非常快了。但是升级PHP7.0以上,居然openssl还是低于1.1.1,只能编译sm3.so扩展。
php5.6及php5.3的sm3扩展没有写。
目前仅支持php7,需要的联系。不免费,熬了几个夜才最终敲定。