记录一次前端加密遇的坑

一、背景:

一个银行较小的系统,数据包传输的值加密处理。故扣加解密代码编写脚本,以便测试方便 。

二、坑的由来:

过程:

抓包发现数据加密,意料之中,常规思路寻常分析加密函数。

看代码就能大致推测开发的水平好坏,看着前端代码,越看越乐。。。。

在console执行函数,出正解结果。接下来扣代码,写脚本:

报错,debug追踪一下。

发现引用的第三方包,弄了一个自执行函数,闭包了。。。查资料,发现自执行函数在函数内部定义的变量和函数就只能在函数内部访问,在外部无法访问,在该上下文环境中,调用函数时就提供了一个创建私有成员的方式,所以我执行脚本报错。

接下来做了N次尝试,这个问题困扰好久没解决,(没办法,js太差)

1.尝试解包。我错了,我高估了自己。

2.直接抽取关键代码。

3.看到是base64js,相直接扣出原版的base64试试,发现base64js是经过二次开发的,加密函数调用的他的方法原版没有。

4.在nodejs上执行不成功,用python调用js执行看下。结果一样。

5.。。。。。

时间成本太高了,,,换方案吧,估计不在我能力范围内。

三、替代方案:

这就是没办法的办法,直接在snippets工具中执行测试脚本。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
var sm4Test = function(text) {
var a = "11HDESaAhiHHugDz";
function encrypt(text) {
console.log("-----------------------------------")
encryptText = new sm4utils(a).encryptData_ECB(text);
console.info("明文是:" + text)
console.info("加密结果是:" + encryptText);
console.log("-----------------------------------")
}
function decrypt(text) {
plainText = new sm4utils(a).decryptData_ECB(text);
console.info("明文是:" + text)
console.log("解密结果是:" + plainText)
console.log("-----------------------------------")

}
return {
encrypt: encrypt,
decrypt: decrypt
}
}

var text = "exAcymtIEQj2Y0ul8aIOag==";
var obj = new sm4Test();
obj.encrypt(text);
obj.decrypt(text);

结果如下:

可看到结果正常返回,虽然没有使用nodejs看起来顺眼,但比在console中进行批量操作要省事的多,为折中办法。

四、总结:

简单总结自执行函数:

1.基本格式:

1
(function () { /* code */ } (args));

2.作用:

  • js中没有块级作用域,用来隔离作用域避免污染,或者截断作用域链,避免闭包造成引用变量无法释放。
  • 利用立即执行特性,返回需要的业务函数或对象,避免每次通过条件判断来处理。