Android安全性分析

  安全永远是一个重要的主题

Posted by MrCodeSniper on October 11, 2017

网络安全

建议与服务器通信使用HTTPS协议 HTTPS=HTTP+SSL(安全套接层) 提供SSL数字证书

重点在SSL是如何加密保证连接不会被第三方截取后得到明文

本质在于 如何保证双方协商对称加密算法的安全

HTTPS采用运行时生成随机数决定对称算法来保证每个客户端的对称密钥都不同

但是密钥和对称算法都需要服务端告诉客户端 如何保证这个过程的安全?

服务端使用非对称算法的私钥对这个过程进行加密 所以客户端有公钥 这样就只有服务端能解密 保证了client->server的安全

客户端若需要从服务器获取公钥

客户端如何保证这个公钥没有被篡改? 这里就用到了第三方证书

服务端将公钥交由第三方证书的私钥加密 客户端使用第三方的公钥进行解密 若能成功解密 则没有被篡改过

但这里又有安全隐患!因为第三方机构发放证书是一对多的 若恶意中间人使用 他们加密后的证书给客户端 客户端也可以解密 使得客户端请求的正文遭到篡改

客户端如何保证这个证书没有篡改?答案在证书本身

证书上写着如何根据证书的内容生成证书编号 且证书编号是经过第三方机构私钥加密了

当客户端拿到证书后,使用第三方机构公钥解密生成真正的证书编号 与客户端生成的编号进行比较

如果客户端计算出来的证书编号与证书中的证书编号相同,则验证通过

第三方机构的公钥如何在客户端的机器中呢?

其实在浏览器和操作系统都会维护一个权威的第三方机构列表(包括它们的公钥)。因为客户端接收到的证书中会写有颁发机构,客户端就根据这个颁发机构的值在本地找相应的公钥。

本地数据安全

1.尽量用内存缓存数据 攻击者要dump内存则就难得多。Dump内存需要ROOT权限。

2.数据存入缓存、数据库或者SharedPreferences之前将其加密

3.加密算法可以放入so库中 使用jni调用 增加安全性

4.检测设备是否root 若root限制应用功能 防止被用来攻击

代码安全

1.Intent泄漏 尽量使用显示跳转 明确的指定你想发送数据的接收者 否则 攻击者只需要简单的定义一个相同的intent-filter就可以拦截你的intent并获取所有数据。

2.使用代码混淆 使用代码混淆转为完全无意义的符号,防copy

APK安全

1.APK加壳

在原apk上再套一层壳apk,运行时在启动解壳程序

第三方加壳平台:阿里,百度,腾讯,360

2.反编译 高级语言源程序经过编译变成可执行文件,反编译就是逆过程。

1.apktool apktool可以将apk中的资源文件反编译出来。但是如果想看build后的代码,使用apktool只能看到smali格式的代码

2.dex2jar dex2jar可以将apk解压出来的dex文件转换成jar包,然后使用jd-gui可视化工具查看源码。

3.jd-gui jd-gui是用来查看jar包中文件代码的一款可视化工具。

4.onekey-decompile-apk 集成上述工具的集成bat

补充

可以参考: