版权归作者所有,转发请注明出处: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.敏感数据保护
敏感数据需要在数据处理的每个环节考虑其安全性
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 知识整理