PHP实现国密SM3算法

        最近对接一个第三方系统,对方要求接口签名加密使用sm3加密算法,不过php没有原生支持该算法的函数,所以需要借助外力了。网上查资料发现在PHP中实现sm3算法,大概有一下三种途径:
        A.使用PHP的OpenSSL扩展实现
        B.使用一个PHP扩展(php-sm3)实现
        C.使用大佬封装好的PHP类库实现

方法A
      openssl在1.1.1版本中支持了国密算法,但是我看了一下我的环境,内置的openssl是1.0.2k,版本比较老。但是升级openssl也牵扯到对php中openssl扩展的升级,此服务器还有其他项目在运行,所以此方法就放弃了。

方法B
      在网上发现了a php extension for sm3(实现sm3算法的php扩展),Git地址:https://github.com/luzhuqun/php-sm3 。按照里边的方法进行安装:

      从安装到测试都很顺利,但是在使用的时候,出现了很多不可思议的错误,我的环境的PHP版本是7.2。在加密之后去调用第三方系统接口的时候,偶尔会出现nginx抛出的502错误,查了nginx的error log如下:

recv() failed (104: Connection reset by peer) while reading response header from upstream

      再去检查下php-fpm的错误log如下:

[15-Sep-2021 14:54:29] NOTICE: [pool www] child 20665 exited with code 0 after 8620.062716 seconds from start
[15-Sep-2021 14:54:29] NOTICE: [pool www] child 12189 started
[15-Sep-2021 14:54:29] NOTICE: [pool www] child 20646 exited with code 0 after 8636.730784 seconds from start
[15-Sep-2021 14:54:29] NOTICE: [pool www] child 12190 started
[15-Sep-2021 14:54:35] NOTICE: [pool www] child 20700 exited with code 0 after 8622.456855 seconds from start
[15-Sep-2021 14:54:35] NOTICE: [pool www] child 12196 started
[15-Sep-2021 14:54:54] NOTICE: [pool www] child 20657 exited with code 0 after 8649.930169 seconds from start
[15-Sep-2021 14:54:54] NOTICE: [pool www] child 12246 started
[15-Sep-2021 14:56:49] NOTICE: [pool www] child 20710 exited with code 0 after 8744.678411 seconds from start
[15-Sep-2021 14:56:49] NOTICE: [pool www] child 12548 started
[15-Sep-2021 15:04:39] NOTICE: [pool www] child 21734 exited with code 0 after 8807.254438 seconds from start
[15-Sep-2021 15:04:39] NOTICE: [pool www] child 13876 started
[15-Sep-2021 15:07:53] NOTICE: [pool www] child 23979 exited with code 0 after 8235.041492 seconds from start
[15-Sep-2021 15:07:53] NOTICE: [pool www] child 14342 started
[15-Sep-2021 15:14:39] NOTICE: [pool www] child 26275 exited with code 0 after 7821.893523 seconds from start
[15-Sep-2021 15:14:39] NOTICE: [pool www] child 15539 started

      php worker进程频繁地挂掉和拉起,查了很多资料,各种方法尝试也没解决,最后不得已去尝试方法C。
 

方法C
      在网上找到了两个可以实现sm3的类库
      1.OneSm 类库,但是我看有同胞的文章中说用这个类库加密后有时候得到的结果不准确,而且加密长字符串的时候速度比较慢。于是乎,我就没有去尝试。
      2.SM3-PHP 类库,简介详尽,并且作者字里行间尽显真诚和专业。

      我就按照简介方法集成到项目中,果然没让我失望,完美运行,nice!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值