发布时间:2023-08-29 01:37

关于php国密SM3算法及国密算法3效率问题

背景

最近要调用一个国企接口,签名计算使用的国密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,需要的联系。不免费,熬了几个夜才最终敲定。


靠谱的卡券系统,现在就开始

云卡券无需下载部署,注册即用,搭建与用户无障碍兑换的桥梁