Java的SM3加密算法,实战教学(附GitHub源码)

极简教学Java的SM3加密算法[附上github源码]

SM3算法:SM3杂凑算法是我国自主设计的密码杂凑算法,适用于商用密码应用中的数字签名和验证消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。为了保证杂凑算法的安全性,其产生的杂凑值的长度不应太短,例如MD5输出128比特杂凑值,输出长度太短,影响其安全性SHA-1算法的输出长度为160比特,SM3算法的输出长度为256比特,因此SM3算法的安全性要高于MD5算法和SHA-1算法。

此算法适用于商用密码应用中的数字签名和验证,消息认证码的生成与验证以及随机数的生成,可满足多种密码应用的安全需求。再SM2,SM9标准中使用。 此算法对输入长度小于2的64次方的比特消息,经过填充和迭代压缩,生成长度为256比特的杂凑值,其中使用了异或,模,模加,移位,与,或,非运算,由填充,迭代过程,消息扩展和压缩函数所构成。具体算法及运算示例见SM3标准。

有兴趣可以自己下去在做补充。

本次讲的SM3算法我运用在了支付密码的加密情景中

先将加密逻辑,给大家展示一下:

首先由数字数字键盘 输入一个6位数的password(密码),然后调用接口, 然后由后台获得密码,然后进行密码的拆分, 如: 123456 拆解 1,2,3,4,5,6 然后存入数组

然后进行第一步的特定解码。 如:自定义的解码表

根据不同的原始数据 先转换成对应的自定义规则,然后再进行加密 依次加密之后,紧接着进行拼装

如: 1 转码后为 bb 然后加密后 xxxxxx 2 转码后为 cc 然后加密后 cccccc … 依次向下

然后拼接 xxxxxxcccccc…依次拼接

再把拼接后的数据做最后一次SM3加密

得出最终我们需要的 EncryptionPassword(加密密码)

好了直接上代码

有两个

添加完依赖后

从上到下说

这个类其实就是简单的枚举类,把我们需要的转码规则封装进了里面 通过 valueOfCode方法 取出对应的转码后的值

这个是我封装的SM3Utils.class工具类,里面注释已经把每个方法讲述的很清楚了。而且包括异常捕获我也写完了。

简单的加密思路就是:我们先拿到前台的密码,然后划分成数组,数组循环转码并加密,然后放入StringBuffer中,拼接完成后,拿着返回的StringBuffer然后去进行加密,加密会把字符串变为byte类型然后在通过特定的杂凑算法规则,进行最后一层返回。也就是我们最后得到的加密后的杂凑字符。 (有兴趣的小伙伴可以去啃一下杂凑算法的底层原理)

最后的话就是我们的测试类

我测试类写的简单的写了一下,并不是很正规,其实直接写main方法调用主函数(pwdEncrypt方法)直接传参进行加密即可 如果按照TDD的测试方式规范来写,我这样肯定少了很多东西,还望见谅。

来了,Python终于可以不用源码发布了,代码加密2种思想

我们在使用Python做完项目后,给客户去部署,但是又不想让客户看到自己的代码,这时我们怎么办?

下面就来介绍不使用Python源码发布的两种思想:

我们可以让Python的源码直接生成2进制的文件,从而达到避免源码暴露的问题,编译方式有以下几种:

.pyc文件是.py文件动态编译后生成的能够被Cpython解释器解释的二进制代码,可以直接在.py引入,就像我们引用模块一样使用,非常简单方便,使用方法:

生成.pyc后我们可以直接将.py的源码文件删除掉了

优点

  • 为破解提高了一点点门槛儿
  • 兼容性好,.py能运行,.pyc就能运行

缺点

  • 解释器兼容性差,.pyc 只能在特定版本的解释器上运行
  • 有现成的反编译工具,破解成本低

python-uncompyle6 工具可以将.pyc文件反向编译成.py文件,效果很好。

我们可以利用pyinstall和py2exe将python代码直接编译成可执行文件,具体方法可以自行百度查询。

优点

  • 破解难度增加
  • 方便目标机器运行

缺点

  • 兼容性差,容易引起.so文件未找到的问题
  • 可以按照规则找到.pyc文件进行反编译

我们可以将python代码翻译成C代码,并且进一步进行编译生成.so动态链接文件,我们可以使用.py文件直接引用这个文件中的模块儿。

这个我们需要更换另一种解释器Cython解释器,Cython使用方法请大家自行百度,这里篇幅有限,不再赘述。

优点

  • 二进制文件难以破解
  • 可以突破python中的GIL的限制
  • 引用方便

缺点

  • 兼容性差,更换平台需要重新进行编译
  • 对于python代码的支持不是100%的完美,可能会有方法未定义的问题

Jython和IronPython两种解释器,利用了Java和.net的平台,编译生成的包可以直接使用jvm和.net进行运行,除了这两个平台还有其他的第三方解释器。

优点

  • 文件破解难
  • 可以突破GIL的限制

缺点

  • 支持的第三方包少,如果要使用可能会进行二次开发
  • 需要借助其他平台

代码混淆的本质就是让代码变得谁都看不懂,但是代码逻辑还是之前的逻辑,其中比较出色的代码混淆工具给大家介绍两款。

具体命令我就不给大家介绍了,主要贴出混淆前后的代码对比。

  • oxyry

源代码

混淆后

看到代码我们是这样的表情

  • pyminifier

源代码

混淆后

看到代码后

无论哪种方案都是不十全十美的,在以后的项目开发过程中,我们还需要加强网络安全方面的意识,防患于未然。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。