关于HTML、js加密、混淆、源码保护、代码安全,防止解压直接看源码

一直有人问HTML加密混淆怎么做,其实这在业内是早已很多人研究过的课题。
假日期间整理一篇文章分享给大家。

我们先理下需求,加密的目的是什么?加密到什么级别?为此我们可以牺牲什么?
我们知道这个世界不存在绝对的安全,加密会被破解、混淆会被反混淆。
技术小白、开发者、黑客,是完全不同的级别,防范不同级别的人策略都不一样。
防范力度越大,投入代价也越大,比如聘请专业的安全公司。
除了投入,我们还需要考虑程序的执行性能和用户体验。
加密的代码在运行时必须解密,混淆后尤其是混淆HTML后,程序的执行性能会下降。
是否真的有必要做这类的源码保护,还需要谨慎取舍。

一般而言,前端的代码,负责的是用户体验,后端的代码,负责更安全的数据处理。
前端不要涉及泄漏太多涉密信息,那么加密的意义不是特别大。
我很少在前端代码里看到值得保护的内容,比如高深的算法,很多代码是没必要牺牲用户体验来保护的。
但有些前端代码涉及最终用户的数据安全,此时还是要努力做数据保护的。

接下来具体分析几种手段。


  1. 不要在前端放敏感数据
    这个听起来是废话,但真的很重要。
    有些开发者在手机端明文存用户的密码,这是非常危险的事情。
    即使是原生开发,一旦手机被root,也会造成数据泄漏。更何况HTML5开发。
    比较好的做法是手机端存token,而不是密码,这里有篇文章专门介绍这块,涉及做登录的开发者推荐仔细看看设计基于HTML5的APP登录功能及安全调用接口的方式(原理篇)

  2. js、css压缩
    压缩不是加密,也不是混淆。但压缩后的js文件,往往也具有混淆的功能。
    js、css压缩是很常见的技术,我们经常看到各种框架的文件名是xxx.min.js,xxx.min.css。
    使用合适的js、css压缩方案,可以减少文件体积、提高载入速度,最重要的是,它还能加快程序的执行性能。简直是有百利而无一害。
    压缩js比较常用的工具是yahoo的YUI混淆,在HBuilder里点菜单工具-插件安装,里面有YUI compress,可以压缩js和css。
    如果js、css比较大,发布前压缩下是比较推荐的做法。

  3. HTML、js、css混淆
    压缩虽然也能混淆,但不是以让别人看不懂为目的,混淆是真正以别人看不懂为目的。
    但是这样的混淆就不像压缩那么有百利而无一害了,它会降低程序执行性能。
    一些开发者不希望发行包解压后可以直接看到源码,那么此时可以使用混淆方案。
    网上搜索HTML混淆,资料和工具都非常多。
    原理都是类似的,js代码变成乱七八糟的字符串,然后用eval执行,HTML代码变乱七八糟字符串,用document.write或innerHTML执行,css也可以动态的在document.write里写<style>。
    这些工具有免费也有商业的,一般越商业的越难被反混淆。
    这个是免费的在线混淆工具 http://www.myobfuscate.com
    这个是比较知名的商业工具,http://www.jasob.com
    其实大家也可以根据原理自己写混淆算法。
    混淆也是一个有年头的成熟技术,比如Google在保护gmail的前端代码时,也是通过混淆来保护的。
    不管是压缩还是混淆,使用grunt来做发布是不错的方式,开发后一键调用grunt处理,非常便捷。

  4. 防止webkit remote debug,即防止浏览器控制台调试
    Android4.4及以上和iOS是支持webkit remote debug的,在HBuilder的教程里也有如何使用chrome调试Android应用,和使用safari调试iOS应用的教程。
    在HBuilder开发的App里,manifest.json里下的plus-distribute下有一个debug标签,标记为false后打包(可视化界面里也有配置),这样的包运行在手机上时webview会阻止浏览器的远程调试请求。
    如果你想调试,那么把debug改为true后再打包。
    当然有些Android rom不是很规范,并不能阻止调试,这属于rom的bug。
    另外注意只有打包才能防调试,真机运行是不能阻止调试的。

  5. 专业加密加固加壳服务
    由于Android的特殊性,针对apk出现了加固、加壳产业,这也是业内常见的apk保护方案。
    很多应用市场都提供加固服务,比如360手机助手的加固。
    还有一批专业公司如爱加密,里面有免费的基础安全保障服务,也有收费的高级安全保障服务。
    这里还有一个防止apk解压的小技巧:http://www.52pojie.cn/thread-287242-1-1.html

  6. HBuilder提供的原生js混淆
    在HBuilder的alpha版(day build)里,官方提供了原生层面的js混淆。(从HBuilder8.8起,正式版也支持了这个功能)
    这种混淆的性能比纯前端混淆的性能要更好,反编译的难度也更大。但目前有个问题就是Android4以下的手机不能运行加密后的版本。
    具体使用方式是在打包界面,可以选择需要加密的js文件,然后打包即可。如下图:

\n

最后,这篇文章对于前端的代码保护也讲的非常专业,值得大家学习http://div.io/topic/1220


15 分享
蔡繁荣 感受呼吸 iseeyo damdmen it_Orz green85 可怜的光头强 火岚 javazz DCloud_HB_深井冰 DCloud_客服_Trust mailboo@163.com liuchonglong226@163.com 1691194298@qq.com skysowe
BigSource

BigSource

mark
0 赞 2017-09-13 17:00
很好爱爱啊

很好爱爱啊

mark
0 赞 2017-05-22 04:08
木子喵

木子喵 回复 DCloud_heavensoft

也就是说在离线打包的前提下,我现在为了保证代码的安全性能做的就只能做到纯前端混淆+防止开启控制台+360加壳了吧?我试过grunt的那些混淆插件,都是对单个单个js文件混淆的,如果全部混淆之后有时候跨webview调用函数会出现一些问题
0 赞 2016-12-27 15:29
DCloud_heavensoft

DCloud_heavensoft 回复 木子喵

目前没有计划,离线打包提供原生混淆太容易被破解
0 赞 2016-12-27 15:15
木子喵

木子喵 回复 DCloud_heavensoft

明白了谢谢~不过我们的应用采用的是离线打包而非云打包,请问今后有提供支持开放离线打包配置原声混淆接口调用的基座的计划吗?
0 赞 2016-12-27 15:07
DCloud_heavensoft

DCloud_heavensoft 回复 木子喵

原生js混淆只能云打包。压缩、混淆是不同的概念,混淆涉及混和反混,用js做的性能是不如原生直接混淆和反混的。
0 赞 2016-12-26 13:51
木子喵

木子喵

您好,请问原生js混淆与用uglify相比有什么不同呢?文中只说“性能比纯前端混淆的性能要更好,反编译的难度也更大”,请问混淆原理具体有什么不同?另外alpha版本提供的原生js混淆只是支持云打包吧,我一直采用的是离线打包方式,请问这样的话要怎么做到原生js混淆?
0 赞 2016-12-26 11:48
豆豆宝贝

豆豆宝贝

mark
0 赞 2016-11-29 22:06
卡特牛

卡特牛

写的真好,解决了我多困惑。
0 赞 2016-11-29 15:24
DCloud_heavensoft

DCloud_heavensoft 回复 liuchonglong226@163.com

请单独发帖,把有问题的js贴出来,我们看看哪里出错了。注意原生js混淆不支持Android4以下的手机。
0 赞 2016-09-14 04:27
liuchonglong226@163.com

liuchonglong226@163.com

你好,请问 用alpha版本在打包app时用了js原生混淆后,生成的app连接不了接口了,我对连接接口的那个js混淆了,请问这个怎么解决,查看了好多问答里面都没有看到,新手求解决,谢谢
0 赞 2016-09-13 15:09
mailboo@163.com

mailboo@163.com

学习下,做个记号!!!
0 赞 2016-08-25 18:48
乖宝宝

乖宝宝

链接打不开
0 赞 2016-07-07 09:49
qixi

qixi

mark
0 赞 2016-05-30 11:45
sbin

sbin

作者可以就远程调试的内容,深入一下.
0 赞 2015-12-21 19:01
hum

hum

token的方式需要官方提供可自定义的加密函数,否则也是容易破的
0 赞 2015-08-01 22:35
刘俊朋

刘俊朋

官方发布的 ,文档说明, 能不能整理到一个栏目下, 共查阅.
0 赞 2015-07-28 00:03
wenju

wenju

Android apk多渠道打包的时候 一直都在用爱加密 挺好的 很方便
0 赞 2015-07-23 09:27
dcl

dcl

如果这种方案或者有其他方案可行,求官方做一做放出个api
0 赞 2015-07-13 12:53
DCloud_heavensoft

DCloud_heavensoft 回复 Danny

加固不是针对HTML的,是针对apk加壳的。加密HTML看第3条,混淆那里。
0 赞 2015-06-21 23:00
Danny

Danny

360加固宝和爱加密都无法加密JS和css呢,我都试过,还是说我用的方式不对?
1 赞 2015-06-21 20:15

要回复文章请先登录注册