版权声明:本文为博主原创文章,未经博主容许不得转载。javascript
这里先说一下APK加固
- 防止二次打包(盗版)
- 防止逆向分析
- 防止调试及注入
- 防止应用数据窃取
- 防止木马病毒
- 防篡改(APK篡改工具:APK改之理,AndroidKiller)
以上的防御均可以用APP加固来实现,这里先说一下最简单的反编译,相信不少人都用过反编译工具。其实咱们正常打包出来的apk就是一个压缩包,你解压缩或者反编译基本就拿到了你这个应用的源代码。反编译工具:dex2jar(ApkToolkit) jd-gui 等。我使用的是
对你的apk解压缩后,你能够看到以下:
当你对你的应用进行加固之后,你再尝试着去反编译,我这里以360加固为例,你反编译以后的获得东西以下
未加固APK:
加固APK:
这里你们百度确定能看到一些什么360脱壳圣战啊什么的文章介绍,我想说那是扯淡的。不相信的朋友能够按照那些文章去试试。这里介绍一下国内的几个加固商
固然还有其余的加固厂商,好比百度、腾讯、阿里、通付盾、网易易盾。这里你们喜欢用哪一个就用哪一个。腾讯和阿里虽然是IT巨头,可是毕竟有些厂商是专业作这个的。这里我就不作推荐了,有些加固自带崩溃日志,数据分析等等。使用加固后可对以上进行有效的防御。加固APK以后:篡改后没法正常运行、没法正常动态调试、反动态注入没法注入、反编译没法获取到原dex代码或完整的dex代码、So文件的总体加密,使用自定义连接器的技术,对SO文件进行总体的加密,彻底阻止 IDA等逆向工具的静态分析。java
组件安全
– 描述:测试客户端是否包含后台服务、Content Provider、第三方调用和广播等组件,Intent权限的设置是否安全。应用不一样组成部分之间的机密数据传递是否安全。程序是否窃取手机用户的隐私信息。
– 建议:建议在开发客户端时不要暴露内部组件,若是有特殊需求也需进行权限控制,令使用这些组件时须要申请相应权限。android
总体解决:以上客户端程序保护可经过代码混淆配合apk加固所有解决git
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);// 防止屏幕截屏
私密问题验证
– 描述:验证客户端是否存在忘记密码时的私密问题验证
– 检测:相似于QQ的私密问题验证
– 建议:我以为这个根据需求走,也不必定说这个就好。一个普通的APP这样搞,用户体验会不好。除非你作到了QQ那种地步github
总体解决:无,一个一个搞吧,须要和后台配合着。这里只说一下界面劫持
@Override
protected void onPause() {
// 若程序进入后台不是用户自身形成的,则须要弹出警示
if (needAlarm) {
// 弹出警示信息
Toast.makeText(getApplicationContext(),
"XX的登录界面被覆盖,请确认登录环境是否安全", Toast.LENGTH_SHORT).show();
}
super.onPause();
}
就是在登陆界面重写onPause方法。这个界面劫持只须要在登陆界面作防御。needAlarm是定义的变量,初始化为true,而后监听home键和返回键以及你自身登陆界面的其余activity的跳转。若是用户执行了监听的操做needAlarm赋值为false,说明是用户自身的操做,不是界面劫持。算法
手势密码复杂度
– 描述:测试客户端手势密码复杂度,观察是否有点位数量判断逻辑
– 检测:这个应该没有明确的,就是自身感觉吧
– 建议:本身定标准吧数据库
手势密码修改和取消
– 描述:检测客户端在取消手势密码时是否会验证以前设置的手势密码,检测是否存在其余致使手势密码取消的逻辑问题
– 检测:检测客户端在取消手势密码时是否会验证以前设置的手势密码,检测是否存在其余致使手势密码取消的逻辑问题
– 建议:不该该存在其余致使手势密码取消的逻辑,客户端在取消手势密码时应验证以前设置的手势密码数组
手势密码本地信息保存
– 描述:检测在输入手势密码之后客户端是否会在本地记录一些相关信息,例如明文或加密过的手势密码。
– 检测:找到存储文件,看其是否加密
– 建议:应该进行加密浏览器
手势密码锁定策略
– 描述:测试客户端是否存在手势密码屡次输入错误被锁定的安全策略。防止木马使用穷举法暴力破解用户密码。由于手势密码的存储容量很是小,一共只有9!=362880种不一样手势,若手势密码不存在锁定策略,木马能够轻易跑出手势密码结果。手势密码在输入时一般以a[2][2]这种3*3的二维数组方式保存,在进行客户端同服务器的数据交互时一般将此二维数组中数字转化为相似手机数字键盘的b[8]这种一维形式,以后进行一系列的处理进行发送。
手势密码抗攻击测试
– 描述:验证是否能够经过插件绕过手势密码的验证页面
总体解决:手势密码的后面两个检测我也没有遇到过。并且如今手势密码怎么说,可能我接触的不是不少吧。有兴趣的朋友能够找相关资料研究下
通讯加密
– 描述:验证客户端和服务器以前的通讯是否使用加密信道。
– 检测:能够利用抓包软件进行查看
– 建议:使用https或者是http+403端口进行通讯。
关键数据加密和校验
– 描述:测试客户端程序提交数据给服务端时,密码等关键字段是否进行了加密和校验,防止恶意用户嗅探和修改用户数据包中的密码等敏感信息。
– 检测:抓包
– 建议:建议帐号,密码,卡号,金额等进行加密处理,同时整个数据包进行二次加密,返回的敏感信息进行加密,同时返回数据包进行二次加密,而且使用增长随机因子的校验字段,而且肯定服务器逻辑标志位正确,在删除校验字段时服务器不响应提交的数据包。
证书有效性验证
– 描述:验证客户端和服务器之间是否存在双向验证的机制,同时确认此机制是否完善,服务器是否以白名单的方式对发包者的身份进行验证
– 检测:抓包
– 建议:建议客户端和服务器进行双向认证,而且服务器经过白名单的方式验证客户端证书以保证证书的有效性。
访问控制
– 描述:测试客户端访问的URL是否仅能由手机客户端访问。是否能够绕过登陆限制直接访问登陆后才能访问的页面,对须要二次验证的页面(如私密问题验证),可否绕过验证。
– 检测:利用截包工具获取url,能用浏览器打开该url。
– 建议:建议服务器进行相应的访问控制,控制对应页面仅能经过手机客户端访问。同时进行页面访问控制,防止绕过登录直接访问页面的非法访问。
短信重放攻击
– 描述:检测应用中是否存在数据包重放攻击的安全问题。是否会对客户端用户形成短信轰炸的困扰。
– 建议:抓包
– 建议:token和手机号一块儿,重放没法形成短信轰炸
这个须要根据业务进行检测
BluetoothAdapter blueadapter = BluetoothAdapter
.getDefaultAdapter();
if ((blueadapter == null)
|| (blueadapter.getAddress() == null && blueadapter
.getName() == null)) {
MessageBox.promptDialog("请使用真实手机登录",
LoginActivity.this);
}
固然else以后我是登陆操做,可是登陆前作了一些东西。这个就像消息推送同样,手机的惟一标识cid之类的绑定。这里只是给出个思路
这个我随便截两张图给你们看一下,你们了解一下。一看大家就知道是什么了
加密分为对称加密和非对称加密
对称加密
– 特色:高效,存在密钥交换问题,安全度不如RSA,可是能胜任大部分加密
– 明文P 加密方法E 密文E(P) 解密方法D 加密密钥K 解密密钥K’
DK’(EK(P)) = P K = K’
EK(P):这是加密
对称加密是基于乘积加密的(乘积加密是结合了置换算法和转置算法,有兴趣能够了解一下)。而AES和DES都是基于乘积加密。AES加密比DES要高。可是如今也有3DES加密。
非对称加密
– 特色:安全性高,没有密钥交换问题,效率低
– 明文P 加密方法E 密文E(P) 解密方法D 加密密钥K 解密密钥K’
DK’(EK(P)) = P K != K’(公钥和私钥不同,可是同时产生)
你们若是以为还能看,顶下鼓励一下,谢谢。有不妥之处也欢迎你们评论