{% if theme.baidu_site_verification %} {% endif %}

密码机对接使用总结


前言

         最近项目中需要对接密码机,密码机的作用是:对保密性高的系统,提供专门的密码运算功能。SM1、SM2、SM3、SM4、SM9等商用密码算法,提供丰富的软件开发接口,可以用java语言实现接口调用。可以用客户端添加密钥,但要在电脑上先插入类似以前网银U盾东西。刚开始比较担心,没干过,但随着不断探索,不断熟悉中,感觉也没那么难了。

接口调通

    这一步先用单元测试,根据密码机厂家给出的文档进行调试,只有数据连通,才能进行业务处理。但提供的文档内容有限,厂家那边技术联系不上,自己摸索只能多试。

熟悉文档

这种产品都是自研的,所以网上的资料很少,一定要对公司发来的文档熟悉。

导入特定jar包

首先就是要用到特定的jar包,这个包网上的maven库没有,所以只能手动导入,密码机厂家会有提供,导入SpringBoot项目就行。

mvn install:install-file -DgroupId=com.jyj -DartifactId=examples -Dversion=1.0.1-SNAPSHOT -Dfile=D:\XXXX.jar -Dpackaging=jar

以上举例:比如jar包放在D盘的根目录,以上三个参数对应maven里的参数。我命名不规范,只要不重复就行。

install

在maven中把install的信息完整填上,就能引入本地jar包

maven引入

调试参数

传参的内容和文档内容还是有些差距的,比如机器ip。

总结大体流程就是 1创建会话 2获取访问控制权限 3调用接口 4关闭会话

最后调试的收获就是用密码机对传入的字符sm4加密,sm4解密,hmac做完整性。

sm4加密特点是明文数据相同情况下,密文每次生成不一样,解密的话能返回明文。hmac是同样的明文,密文数据一样。

更换系统自带的登录加密方式

  系统是基于ruoyi的,自带加密方式BCryptPasswordEncoder。这次我把它改为密码机加密方式。用到了刚说的测出来的sm4加解密。但难点在于这个SpringSecurity框架封装了太多东西。SpringSecurity底层细节不了解,导致我昨天晚上调试了很久,还好参考了网上一篇帖子,问题解决。

我刚开始想的是你既然用的是BCryptPasswordEncoder加密方式,那我把你加密方式删了,改成我的不就行了吗?encryptPassword(生成密码)matchesPassword(判断密码是否相同)。这两个改了以后,经过debug逻辑上没问题。但就是报错。结果那个帖子给了我一些思路:

1 新增加一个类xxxPasswordEncoder继承PasswordEncoder,实现encode和matches两个方法,实现自定义加密逻辑

2 第二步找到securityConfig的配置文件,在项目中的framework 中的config,可以找到两个方法,

在配置文件中新增一个xxxPasswordEncoder方法,注入bean,

把configure方法中的bCryptPasswordEncoder()修改为新增的xxxpasswordEncoder()

configure

3 修改common中的utils的securityUtils,其中要修改两个方法encryptPassword和matchesPassword(登录的流程会调用这两个方法),改为调用密码机的逻辑,原来的逻辑注释。

这样系统登录就会自动调用你写的逻辑,很神奇。

小结

通过这一波操作下来,能略微感受到优雅代码和屎山代码的那种差异。优雅代码便于维护,而屎山代码只要稍微一改很容易出bug。码字不易,请多鼓励。如有疑问请加我QQ1239463490


文章作者: 煜总
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 煜总 !
  目录