分 类: 其他教程
统 计: 共 433 次获取
创建时间: 2024-07-19 10:15:50
01浅谈反编译
大家好,今天主要说下如何防止小程序被反编译与API接口安全,对于这个知识,我了解的比较浅。简单的说,反编译其实就是利用逆向分析,还原软件或者程序源代码,反编译可以作为自己开发软件时的参考。
通俗地讲,反编译就是扒源代码了。微信对于小程序的保护是有限的,对于微信小程序这种用 js 开发的程序来说,保护就显得比较的没意义,就像你在网页里开发的前端 js 一样,对方无论如何都能拿到的,既然小程序前端不安全,那么后端处理就显得很重要了。
官网唯一能做的就是尽可能进行代码混淆,让他们不能方便地进行二次开发,微信开发工具里的上传时代码保护,估计就是这个功能吧。
02常用的方法
目前我知道的有这几种方案,仅供参考
1、利用云开发,云函数实现核心功能。
2、利用后端服务器对小程序的API接口进行验证处理。
3、使用uniapp编译成小程序,经过编译后,无法还原uniapp代码。
4、使用第三方框架开发生成代码是混淆。
5、使用分包方式上传代码,增加反编译难度。
03小程序接口
首先声明下,以下内容仅仅个人观点,部分非原创来源于:极客癖。
以上常用的方法,先说第五点,分包不行,无非就是人家多逆向几个包,再说第四点利用第三方框架开发生成代码是混淆的,这个也是不行的,虽然你生成后代码看不懂,但反编译后的这些代码会进行规整排版,对于程序员来说,还是可以看懂的。第三点,目前就我知道的,可以通过原生的小程序代码转成uniapp代码,但是如果是uniapp编译,是无法完整还原uniapp代码,所以这个方法是安全的,最后就来谈谈接口参数加密验证,普通的参数加密验证,人家看到前端代码可以模拟加密访问接口,token也不行,人家也能模拟token啊,所以这里就利用小程序的静默登录功能,也就是验证code,每次打开程序仅有两次数据传输,所以我在每次数据传输时都加一个wx.login生成的code
这种方法就是利用后端服务器对小程序的API接口进行验证处理,这个code非常特殊,它每次生成都不一样,而且用过一次后便作废,本来用于获取用户与该小程序的唯一标识openid,所以这个code也是与你的appid绑定的,别人小程序生成code与你的也不能互通。通过这点,我们后台在每次接收数据时都对code进行登录验证,能登录那肯定是你小程序正常请求,不能登录呢?不是抓包的爆破你接口,就是反编译你小程序用自己appid测试的二五仔,这时我们就直接返回准备好的错误数据。
关于云开发云函数我了解不是很深入,这里就不班门弄斧了。
但是云开发云函数有人说代码可以反编译,截至目前我是没有反编译出来过,这种方法也是相当的安全。
04API接口
大家都知道,不仅仅小程序有API接口,很多软件、程序也是存在API接口,在这过程中肯定都离不开签名验证。在签名验证的时候,发送方和接收方约定一个加密的值,进行生成签名。这里分享下代码示例,当然,高手勿喷,毕竟也是个新手,没有什么编程基础,就去年开始接触这些东西。
代码示例MD5验证:
<?php//验证签名if ($_REQUEST['sign'] != Createsign()){ echo '无效签名';}else{ echo '签名正常';}
//创建签名function Createsign(){ $str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890'; $sign = ''; /*打乱字符串 $randStr = str_shuffle($str); $substr = ubstr($randStr,0,12); */ $substr = substr($str,0,12); return md5(md5($substr).md5($sign));}
<?php //token $token=$_REQUEST['token']; //时间戳 $timestamp=$_REQUEST['timestamp']; //签名 $sign=$_REQUEST['sign']; $tamp=time(); $sjc=$tamp-$timestamp; $tokenyz=gettoken(); $signyz=md5($token.$timestamp); if(empty($token)||empty($timestamp)) { echo "参数不存在"; } elseif($sjc<0 || $sjc>60){ echo "请求过期"; } elseif($tokenyz!=$token){ echo "token验证失败"; } elseif($signyz!=$sign){ echo "签名验证失败"; } else{ echo "验证通过"; }function gettoken(){ //这里是生成token的方法 }