类别 | 安全点 | 安全等级 | 备注 | |
数据存储安全 | 外部存储 | 对与外部存储的隐私数据内容要进行加密,密码保存在内部存储,由系统托管或者由用户使用时输入。 | 3 | 外部可任意读,内部基于linux权限管理 |
系统数据外部存储需要加密 | 2 | |||
将软件运行时依赖的数据(服务器列表)保存在内部存储,或使用前比对hash | 3 | |||
动态加载的外部程序代码加载前要做完整性验证 | 2 | 例如存储在sd卡的含扩展功能的dex,jar | ||
内部存储 | 内部存储用户隐私信息需要进行加密 | 3 | 用户手机可能root,所以即使存储在内部也不安全。 | |
使用openFileOutput(String name,int mode)创建文件时,第二个参数不要使用Context.MODE_WORLD_READABLE或 Context.MODE_WORLD_WRITEABLE,造成全局读写。如果要跨应用共享数据,一种较好的方法是实现一个Content Provider组件,提供数据的读写接口,并为读写操作分别设置一个自定义权限。 | 3 | |||
通信 | 对敏感数据采用基于SSL/TLS的HTTPS进行传输 | 3 | 在SSL/TLS通信中,客户端通过数字证书判断服务器是否可信,并采用证书中的公钥与服务器进行加密通信。 | |
通过短信注册或接收密码的方法,可能引起假冒注册、恶意密码重置、密码窃取等攻击。此外,这种与手机号关联的账户还可能产生增值服务,危险更大。较好的实现方式还是走Internet。 | 2 | |||
密码策略 | 使用基于凭据而不是密码的协议满足这种资源持久访问的需求,例如OAuth。 | 2 | 例如 记住密码功能。Base64、固定字节或字符串异或、ProtoBuf等方法对密码编码。攻击者可以对Android软件进行反汇编和反编译。攻击者可以借此了解软件对密码的编码方法和编码参数。 | |
对外服务要进行密码验证,并杜绝弱密码 | 3 | |||
组件安全 | 广播接受者要设定权限 | 3 | ||
无外部程序调用组件, 则android:exported设置为false | 3 | 外部程序指签名不同,用户ID不同 | ||
如果组件需要被特定程序访问,则通过 android:permission属性指定一个权限字符串,必要情况下提升permission的level,例如到signature级别 |
3 | 例如<Activity android:name=".MyActivity" android:permission="com.droider.permission.MyActivity"> <inent-filter><action android:name="com.droider.action.work"></action><intent-filter><Activity> |
||
代码安全 | Java代码需要进行混淆或者加密处理 | 3 | 可使用ProGuard、apkprotect等工具 | |
设置反调试保护机制,防止修改内存代码和数据,分析程序逻辑,进行攻击和破解等行为。对于金融行业客户端,该风险可修改客户端业务操作时的数据,比如账号、金额等。 | 2 | |||
so文件需要进行保护 | 2 | 可进行加壳,加花指令等 | ||
App字符串,配置信息等资源要进行加密,防止攻击者盗用、篡改,生成钓鱼App | 3 | |||
采取防止二次打包措施,例如启动校验签名 | 3 | |||
服务器安全 | 不要使用IMEI或IMSI作为唯一认证凭据 | 2 | 若使用IMEI或IMSI作为认证的唯一凭据,攻击者可能伪造并获得服务器中的用户账户及数据。 | |
对手机终端提交的输入进行过滤,限制敏感字符的输入,可对< > ( ) & # 这些符号进行转义,或采用参数化查询策略,防止sql注入等 | 3 |