安全
1、两个大方向展开——
在引进SEAndroid安全机制之前,Android系统的安全机制分为应用程序和内核两个级别。应用程序级别的安全机制就是我们通常说的Permission机制。一个应用如果需要访问一些系统敏感或者特权资源,那么就必须要在AndroidManifest.xml配置文件中进行申请,并且在安装的时候由用户决定是否赋予相应的权限。应用安装过后,一般是通过系统服务来间接使用系统敏感或者特权资源的。这样系统服务在代表应用使用这些资源之前,就会先检查应用之前是否已经申请过相应的权限。如果已经申请过,那么就直接放行,否则的话,就拒绝执行。
内核级别的安全机制就是传统的Linux UID/GID机制。在Linux中,每一个用户都拥有一个用户ID,并且也有一个用户组ID,分别简称为UID和GID。此外,Linux系统的进程和文件也有UID和GID的概念。Linux就是通过用户、进程、文件的UID/GID属性来进行权限管理的。
几个实际开发中常见维度
1、混淆代码
加强版的混淆是用DexGuard
2、Log清理
利用BuildConfig.DEBUG判断是否是release版本,如果是就要去掉部分log
数据存储——文件加密,禁止将敏感信息保存在外存,contentProvider限制export属性或者限制在同签名应用之间流通
1、应用内存保护
要为敏感数据提供额外的保护,您可以选择使用该应用无法直接访问的密钥来对本地文件进行加密,并使用未存储在相应设备上的用户密码加以保护。不过,如果攻击者获得超级用户权限,就可以在用户输入密码时进行监控,数据也就失去了这层保护屏障
2、外部存储
由于任何应用和用户都能读写其中的内容,就不能将敏感信息保存在外存中
3、contentprovider
如果不暴露数据,就设置export为false,如果只限制数据在具备相同签名的应用之间流通,就将android:protectionLevel改为signature级别。
数据库安全——敏感信息不要明文存储
SQLCipher——一个开源库,是一个在SQLite基础之上进行扩展的开源数据库,它主要是在SQLite的基础之上增加了数据加密功能
Activity安全——设置为显式intent调用,或者在intent中添加extra判断调用者来源
设置私有activity
私有activity不能由其他应用程序启动,因此它是最安全的。当一个activity只在本APP内部使用时,只要将activity声明为显式intent调用方式,那么就不需要担心其他应用程序调用开启。
然而,有一个风险是第三方APP可以读取一个开启activity的intent。因此,为了避免第三方应用程序读取Intent来复制intent,我们可以在intent中放置一些extra做判断,避免第三方应用程序调用。
一个私有activity必须做到的关键几点如下:
1)不声明taskAffinity
2)不声明launchMode
3)设置exported属性为false
4)保证intent发送时的安全性,确定intent是来自本应用程序(签名验证和包名验证)
5)在确保是本应用程序发送Intent的时候,可以防止一些敏感信息
6)启动activity的时候不设置FLAG_ACTIVITY_NEW_TASK
7)使用显示的intent和指定的类的方式来调用一个activity
8)敏感信息放在extra中发送
9)在onActivityResult的时候需要对发挥的data小心处理
私有BroadCastReceiver——使用显式intent,exported为false,不添加intent filter
私有广播的几个关键点如下:
1)不添加intent-filter
2)exported属性为false,不接受其他应用广播
3)广播处理完毕后要终止掉广播
4)发送广播时候使用显示intent
网络安全——更新加密提供程序,添加三方库支持
要更新加密提供程序,您需要包含Google Play服务。在build.gradle的模块文件中,将以下行添加到dependencies部分:
implementation 'com.google.android.gms:play-services-safetynet:15.0.1'
该安全网服务API还有更多的功能,包括安全浏览 API,检查的网址,看看他们是否已被标记为已知威胁,以及验证码 API,以防止垃圾邮件和其他恶意流量您的应用程序。
数字签名
APP开发者使用私钥,以证书的形式对APP进行签名。
对关键的代码或者数据进行数字签名验证,可以有效的降低apk被篡改带来的风险。
组件访问权限
http://wangkuiwu.github.io/2014/07/06/ContentProvider-Permission/
可以对不同安卓组件contentprovider、activity、service设置自定义权限,让调用者必须具备权限。
其他
使用安全键盘防止木马替换键盘而记录用户输入信息
短信验证,最好是做60秒倒计时。
参考:
https://zhuanlan.zhihu.com/p/55902235
https://www.jianshu.com/p/0eb6df1e9c4d
网友评论