简介
众所周知,为了保障商用密码的安全性,国家商用密码管理办公室制定了一系列密码标准,包括SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法(ZUC)那等等。
SM1、SM4、SM7、祖冲之密码(ZUC)是对称算法;SM2、SM9是非对称算法;SM3是哈希算法。其中SM1、SM7算法不公开,调用该算法时,需要通过加密芯片的接口进行调用;
算法分类
算法名称 算法类别 应用领域 特点
SM1 对称(分组)加密算法 芯片 分组长度、密钥长度均为 128 比特
SM2 非对称(基于椭圆曲线 ECC)加密算法 数据加密 ECC 椭圆曲线密码机制 256 位,相比 RSA 处理速度快,消耗更少
SM3 散列(hash)函数算法 完整性校验 安全性及效率与 SHA-256 相当,压缩函数更复杂
SM4 对称(分组)加密算法 数据加密和局域网产品 分组长度、密钥长度均为 128 比特,计算轮数多
SM7 对称(分组)加密算法 非接触式 IC 卡 分组长度、密钥长度均为 128 比特
SM9 标识加密算法(IBE) 端对端离线安全通讯 加密强度等同于 3072 位密钥的 RSA 加密算法
ZUC 对称(序列)加密算法 移动通信 4G 网络 流密码
SM2算法加密案例
逆向思路一般有搜索加解密函数,或者通过断点进行分析
本次案例比较简单,就直接通过前端登录页面分析
SM2是非对称算法,公私钥是不一样的,拿到公钥只可以用来加密,如果需要解密需要拿到服务端的私钥
而且生成的SM2密文值中加了随机值,对同一个字段加密的密文是不一样的
所以本文章只涉及通过逆向找到加密函数利用
前端分析
开启开发者工具发现系统只对password字段做了加密处理
打开应用系统界面,分析登录按钮执行的函数,点击登录按钮会执行checkLogin函数,该函数包含了pubkey和加密所用的函数
全局搜索sm2Encrypt,发现在sm2.js文件中,下载该js文件到本地
逆向分析思路
通过node.js直接执行sm2.js文件,可以发现缺少了很多的报错信息,
解决办法:定义一下window,导入CryptoJSnavigator未定义,定义一下navigator
最后一个报错是SM2Utils未定义,在js文件中搜索一共发现两处,
window.SM2Utils = {},因为在浏览器中,window对象可以直接使用,而在本地报错,在调用SM2Utils的这里,改一下
最后直接执行看是否有报错,有报错就需要继续补环境
没有报错说明环境是没有问题了,直接在js中console.log打印加密后的信息,例如:
明文:123
Python调用JS文件
直接使用execjs调用js文件
调用js时候会有个编码错误,设置`errors='ignore'无视报错信息,不影响脚本执行结果
后续可以用python直接调用该js文件加密,然后暴力破解或者测试登录接口漏洞
自己写了个小脚本测试了下通过结果提交账号口令,通过对前端源代码逻辑分析,回显数据为空调用login函数登录成功!!!!!!!!!!
本文章只是提供一个小小的思路。