Android 应用安全 - 案例

版权归作者所有,转发请注明出处:https://www.jianshu.com/p/d6858420e002

Android 应用安全 - 应用安全概览
Android 应用安全 - 移动应用安全
Android 应用安全 - Mobile安全漏洞Top10(OWASP)
Android 应用安全 - 案例
Android 应用安全 - 检测设备是否Root
Android 应用安全 - 加密算法

前言

提高应用的安全性有助于维护用户信任和设备完整性

1.SharedPrefrence配置

非特殊情况下使用MODE_PRIVATE

getSharedPreferences("mike_preference", Context.MODE_WORLD_READABLE) //风险
getSharedPreferences("mike_preference", Context.MODE_PRIVATE) //低风险

2.Sqlite SQL注入

一般发生在数据查询的时候,可能会导致数据泄露
案例:

val sql = """
            SELECT * FROM tableName where name = ${edit.text}
        """.trimIndent()
SELECT * FROM tableName where name = 张三 //正常
SELECT * FROM tableName where name = 张三 or 0=0 //数据泄露

解决方式:使用 SimpleSqliteQueue 等或 google.zoom @Query @RawQuery 方式去查询数据

3.Export 组件需要判断来源

尽量避免设置:

android:exported="true"

如果需要将Activity进行Export,则需要创建新的权限,以允许限制的应用可以访问,此权限的保护级别应该是基于签名的,以允许使用相同证书签名的应用相互通信,并且需要在public的Activity判断来源,并不是接收所有来源




4.Activity在接收其他Activity传参时要判断来源

同上

5.屏幕挟持

android:filterTouchesWhenObscured="false" //风险
 

打开此设置并设置为true,防止屏幕点击事件挟持,可能会诱导用户点击进入恶意页面或者下载恶意文件

6.使用安全的网络传输协议

推荐使用安全的https文传协议,并且使用正确的证书固定检查,稍后的文章中会详细记录

7.记住密码

记住账户密码的加密方式最好通过公私钥加密最为安全,由Server端去解密

8.会话超时处理

大部分业务都会处理会话超时的逻辑处理,就是超过会话时间之后自动登出,这个时间限制根据APP功能而异,金融银行类App一般建议小于或等于5分钟

9.硬编码的Key

不要在代码中定义硬编码的密钥,硬编码的密钥很容易暴露给外部导致数据泄露

10.密码/账户枚举

当用户输入错误的密码或者账户时,不要提示具体详细的错误信息以及原因,防止密码枚举破解

11.不安全的密码算法

不安全或不建议使用的算法:RC2 MD4 MD5 SHA1

推荐使用的算法:
哈希算法:SHA256
对称加密算法:AES
非对称加密:RSA

12.XML校验

在解析XML文件之前,防止XML文件与预期的结构不同以及对象注入 可以使用XSD模板对XML文件进行校验

13.数据恢复开关

安全要求高的App推荐关闭allowBackup开关,如果打开此开关则此应用的数据可以恢复到其他设备上,支付,金融,聊天类应用可能导致用户数据泄露

14.日志信息泄露

日志信息泄露是非常普遍的问题

不要在日志中包含敏感数据以及用户信息
在生产模式关闭日志信息输出

15.复制粘贴以及剪切板功能

复制,粘贴,剪切板是系统共用的功能,在敏感信息页面尽量避免此功能的使用

16.屏幕录像

通过设置此标签从而限制屏幕录制

window.setFlags(WindowManager.LayoutParams.FLAG_SECURE,WindowManager.LayoutParams.FLAG_SECURE)

17.源代码混淆

代码混淆可以有效避免逆向工程,代码混淆时需要注意将需要混淆和不需要混淆的文件分好包,防止核心功能泄露

19.默认的返回值

在某些安全相关的条件判断中,默认的返回值应该是不安全的不让用户通过的结果

20.提供恰当的权限

应用应该申请最小以及最少的权限,应该审核应用所定义的所有权限是否是充分必要的

21.随机数的生成

使用SecureRandom来获取安全的随机数,注意不要设置seed

22.外部文件存储

除非必要不要将敏感数据存储到在外部存储器,因为外部存储是共享区域不受应用沙盒保护,考虑使用内部存储的方式,并且控制好存储数据的生命周期,如果需要使用外部存储,考虑使用合适的加密方式保护数据

23.单例以及公共变量的使用

在使用单例类中,如果单例对象中有存储用户数据的变量,在多个地方使用的时候注意清理,防止上一次数据缓存造成泄露,在有多个子线程处理公共变量的场景中,需要注意可能会出现调用的同时其他线程也在更改此变量造成数据
问题

24.敏感数据保护

敏感数据需要在数据处理的每个环节考虑其安全性


数据周期.PNG

25.广播接收器使用不当修改用户资料

    override fun onReceive(context: Context?, intent: Intent?) {
        UserInfo.instance.saveImg(intent.getStringExtra(Constants.PHOTO))
    }

在修改用户信息之前需要判断用户登录状态

    override fun onReceive(context: Context?, intent: Intent?) {
        if(UserInfo.instance.isLogin){
            UserInfo.instance.saveImg(intent.getStringExtra(Constants.PHOTO))
        }
    }

持续更新中...

欢迎关注Mike的

Android 知识整理

你可能感兴趣的:(Android 应用安全 - 案例)