什么是安全问题?
从黑客的角度定义,只要黑客能够从app中找到一些方法获取我们的源码根据某些明显的字段得到重要信息从而修改程序以达到一定目的;窃取用户信息;窃取本地重要信息间接可以修改用户信息的,都是安全问题。
安全的意义?
安全问题,在Web开发中很重要,同样在安卓开发中,安全也很重要。安全就像空气,看不见摸不着,一旦出现安全,没有及时修复,对于公司将是致命的伤害。但是也有公司故意巧妙地利用安全漏洞做一些营销,效果非常好,当然,这个是基于可控的基础之上。
安全的分类
大的分类分两种:
一、数据通信安全
二、本地app程序安全
数据通信安全又分两类:
app与服务器通信安全和app本地数据通讯安全
一、数据通信安全
app与服务器通信安全
与服务器进行数据交互,数据肯定要加密。加密主要有对称加密、非对称加密,不可逆加密。从安全性考虑可选择对称加密AES加密方式。AES主要是用在数据本身的加密,即使传输过程中被截取了,也是加密过后的数据。但AES的弊端的是,客户端加密的话,密钥肯定是储存在app中,如果app被成功破解了,数据也就被暴露了。所以只有app本身程序的安全也解决了,app才能相对安全。
非对称加密最普遍的就是RSA加密,因为RSA加密有个长度限制,这就导致了RSA加密不能用于所有的数据交互。但是可以用到一些短数据,比如用户个人信息之类的,在交易中,一次订单的数据也不是很大等。
不可逆加密,比如MD5加密、SHA加密等。所谓的不可逆加密就是,只能单向加密,不能反向解密。MD5把数据加密,最后得到固定长度的16进制编码。这个加密的作用一般是匹配验证,验证某个数据是否改变。比如密码,在向服务器存储密码,一般不会存储明文密码。安卓本地存储个标志也一般不会明文存储。
在通信上,有时并不一定对数据本身进行加密。比如可以使用令牌的方式,具体做法是:用户登录成功后,服务器生成一个访问令牌给客户端,此服务器设置令牌的有效期。客户端的所有请求都携带这个令牌去请求数据。当令牌时效的时候,客户端用户所有请求都请求不到,客户端用户退出登录状态。令牌时效都是由服务器来判断,时效的方式:1、令牌过期。这个一般是用户长期不登录,服务器设置的过期时间已经到了。2、令牌错误,一搬是黑客拿未知令牌恶意请求数据3、令牌更换,一般是客户端在另一台设备上登录重新获取了最新令牌。另外,令牌也可以使用户不用再次输入密码再次登录。
从安全方式来看,请求数据最好使用https协议进行请求。
app本地数据通讯安全
主要是指组件之间的通信,广播,某个图片或者数据标记,携带的明显关键字,有可能被反编译之后smali中查到,比如sharedpreferces存储的xml文件数据
二、本地app程序安全
1.APK破解
程序开发中都会去混淆打包,但是对于逆向工程的高手来说,APK 包非常容易被反编译成可读文件,稍加修改软件逻辑或者插入恶意代码,替换广告商 ID就能重新签名打包成新的 APK。
建议应对方法:
使用 ProGuard、DexGuard 等工具混淆代码;是给程序加固,第三方加固工具都可以用。重要逻辑用 NDK 实现。.so库相对来说很安全了。做三方库的公司,大都把sdk重要的打成.so库,我认为不光是因为Java不能够完成而只能c++完成,还有保密安全这一措施。
2.数据的存储
外部存储(SD 卡)上的文件没有权限管理,所有应用都可读可写。开发者把敏感信息明文存在 SD 卡上,或者动态加载的 payload 放在 SD 卡上;sharedpreferces存储的xml文件数据,本地数据存储是在手机的本地存储data文件下,虽然访问需要系统权限,但对于root的手机,这些在本地的数据很容易暴露出来。
建议应对方法
不建议全局可读写的内部存储方式,不要把敏感信息放在外部存储上面;在动态加载外部资源的时候验证文件完整性;一些重要数据(用户账号密码等),或者标记存储本地的时候也应该进行加密,或者直接存储hash码,而不能直接存储明文。有些存储本地的数据,比如令牌,就需要进行加密处理。登录成功后的重要信息,如需要存储本地,也需要加密。
3.组件暴露 (Activity, Service, Broadcast Receiver, Content Provider)
组件在被调用时或调用其他组件时未做验证,通过调用获取某些信息,构造某些数据。(比如:调用暴露的组件发短信、微博等)。
建议应对方法
验证输入信息、验证组件调用等。android:exported 设置为 false。使用 android:protectionLevel="signature" 验证调用来源。
如果是非常重要的组建,不要在这里面进行配置,如果可以用fragment完成的,最好用fragment来做。并且重要的信息不要在配置文件里面配置。
4.WebView
恶意 App 可以注入 JavaScript 代码进入 WebView 中的网页,网页未作验证。恶意网页可以执行 JavaScript 反过来调用 App 中注册过的方法,或者使用资源。这些恶意程序嵌入 Web App,然后窃取用户信息,远程调用 App 代码。更有甚者,通过 Java Reflection 调用 Runtime 执行任意代码。
建议应对方法
不使用 WebView 中的 setJavaScriptEnabled(true),或者使用时对输入进行验证。
总结
Android 应用的漏洞大部分都是因为开发人员没有对输入信息做验证造成的,另外因为 Intent 这种特殊的机制,需要过滤外部的各种恶意行为。再加上 Android 应用市场混乱,开发人员水平参差不齐。再加上 root 对于 App 沙箱的破坏,Android 升级的限制。如果想要保证你的应用没有安全漏洞,就要记住:永远不要相信外面的世界。