SecurityWorker: Javascript 核心算法全防护

2019-03-27 22:45:04 +08:00
 zyEros

我们自己的工作中会涉及到浏览器端的通信数据加密,但一般普通混淆太容易被黑盒或白盒利用了,后来我们使用 Webassembly 以及 asmjs 加密,但频繁用 C++写相对应的逻辑太麻烦,因此我们在工作中沉淀了 SecurityWorker。简单的说,SecurityWorker 是个可靠的类 WebWorker 环境,他有独立的 VM,兼容 ECMAScript5.1,如此一来既方便你写又有足够的保护强度。

特性:

兼容性

官网: https://www.securitify.io
文档: https://github.com/qiaozi-tech/SecurityWorker

6517 次点击
所在节点    程序员
42 条回复
tyrealgray
2019-03-28 00:36:32 +08:00
啊,记错了,google 的方案是 Closure Compiler,javascript-obfuscator 是另外一个
hanguofu
2019-03-28 02:35:29 +08:00
这个工具太好了,解决了 js 的加密的大难题!
binux
2019-03-28 03:39:58 +08:00
之前暴力破解过一个 fingerprint 的 js 的 VM 加密,直接断下 assign 的 op,修改中间步骤返回值就好了。
你逻辑是加密了,但是终究是要在内存的某个部分拼出完整的请求提交数据的。
zyEros
2019-03-28 05:03:04 +08:00
@binux 里面不存在 js 源码了,只会有离线翻译的 opcode bytes,opcode bytes 会做第二次加密
zyEros
2019-03-28 05:08:02 +08:00
@binux
1.上传代码
2.JS 翻译为 opcode bytes
3.二进制数据加密并重打包
4.核心压缩加壳
5.得到最终文件

运行时解密得到 opcode bytes,然后 vm 执行,除非你知道我的 opcode 设计,否则很难继续 debug
zyEros
2019-03-28 05:10:53 +08:00
@binux 哦,我懂你意思了,但是那样如何被大规模利用是个问题,我们还有一些环境监测,防止 node 运行,如果有时间可以试着破一破帮助我们改进(逃
binux
2019-03-28 05:12:51 +08:00
@zyEros #25
我并不需要源码啊,我直接改的内存数据。
到这步下不去了,1.5. 微信扫码登陆,我不想扫码登陆。
binux
2019-03-28 05:15:04 +08:00
@zyEros #26 确实没法大规模利用,那时候只是要破解一个网站的 fingerprint,而且我是在 electron 中运行的。
zyEros
2019-03-28 05:23:12 +08:00
@binux SecurityWorker 只是保证代码安全,但是其他安全流程是需要使用者去设计的,包括数据的签名检验防止重放,检验 key 唯一下发等等,防止被大规模使用,这不是 SecurityWorker 要解决的问题
Mutoo
2019-03-28 06:23:27 +08:00
最大的风险难道不是“上传文件”到第三方服务,再编译成加密脚本吗。
zyEros
2019-03-28 06:34:48 +08:00
@Mutoo 如果整体开源了就没有安全性可言了,流程和 opcode 设计都能看到,如果上传不信任当然也没办法了
qdwang
2019-03-28 08:09:44 +08:00
@zyEros 可以考虑增加一个 opcode shuffle 的功能。让此功能生成一个随机又特定的 opcode encoder 和 decoder。这样每个用户的 opcode 都不一样,并且不透明的,破解者没那么容易反编译。

但是上面人所说的也对,其实本质上还是可以破解的,只是需要花一些时间。

这类库我也做过,不过不是拿来干代码加密的事情
zyEros
2019-03-28 08:15:47 +08:00
@qdwang 没有 100%的安全(逃
zyEros
2019-03-28 08:19:13 +08:00
@qdwang opcode bytes 我们是会进行二进制混淆的,并且会对 bytes 进行二次加密,每次加密的 key 是随机的,你说的 shuffle 是在二进制混淆的阶段做么
qdwang
2019-03-28 08:49:20 +08:00
@zyEros 请问一下,你们 key 存哪里呢,是 webworker 内存里吗?

随机变换可以在加密阶段前做
zyEros
2019-03-28 10:11:46 +08:00
@qdwang 在 vm 内部通过一些算法取出,所以你有可能能获取到,但是即使取到意义也不大,源码已经变成 opcode,因为你没有 opcode 的设计以及一个供其运行的 runtime
qdwang
2019-03-28 11:55:59 +08:00
@zyEros 哦哦 了解了。
lamada
2019-03-28 13:27:06 +08:00
mark 了,有点意思
luvxy
2019-03-28 14:24:31 +08:00
在哪学这些安全方面的知识
zyEros
2019-03-28 15:05:36 +08:00
@luvxy 遇到问题,解决问题

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/549319

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX