我们在开发Android App时,会签名打包Apk,然后上传到市场。在这个过程中,必然会有一些值得留意的安全性问题来让我们避免自己的App里的关键信息泄露。
1、API安全性
现在不管是XX云还是XX云,都提供了443端口以及免费证书的签发,即便没有使用他们的证书,也可以使用Let's Encrypt来为我们签发一个域名对应的数字证书,作为TLS加密用证书,因此我们可以方便的升级接口为HTTPS,并且适当的在应用内增加伪造证书验证,以便于防止mitm攻击。
2、增加v2签名支持
v1签名已经爆出了随意更改apk包而可以继续通过v1签名验证的漏洞,这个漏洞存在一定的危险性。因此发包时我们可以考虑上Play市场时使用v1+v2混合签名,不推荐只使用v2签发apk,因为v2只能支持Android 7.0以及以上的设备。
国内市场可以考虑只发布v1签名,毕竟国内设备存在这样那样的深度定制系统,带有v2签名的设备可能存在安装不上的问题,为了对定制系统的兼容,对这个不大不小的安全性妥协置之了。
另外,开发调试时可以考虑只用v1签名。v2签名有一定概率会导致Instant Run失败,降低开发效率,因此在debug的buildType时推荐只用v1模式。
推荐显式的开启关闭v2签名描述
signingConfigs {
release {
storeFile file("myreleasekey.keystore")
storePassword "password"
keyAlias "MyReleaseKey"
keyPassword "password"
v2SigningEnabled false
}
}
详见:https://developer.android.com/about/versions/nougat/android-7.0#apk_signature_v2
3、代码混淆
代码混淆不用说了,最基本的代码安全就是要为代码混淆打包。
但是值得注意的是,如果使用了ORM数据库或者类ORM的JSON/XML的序列化反序列化框架库,请将对象实体类避开混淆,关键组件包括四大组件和View的子类、Annotation子接口、以及JS接口类避开混淆。也就是说,任何会成为反射技术、Annotation、AnnotationProcessor(或APT)代码预处理技术有关的类,要内外兼去混淆。
4、关闭四大组件的不必要的导出(export)属性
除了有明示给其它应用可以跳转过来的界面,其它没有设计为可以被外部应用打开的软件一律将导出属性(export)设置为false,并且慎用intent-filter方式(隐式调用)四大组件,能不用则不用。
5、allowBackup属性
有文章说该属性一定要关闭,我们考虑的是,如果本地数据安全设计得当,或者本地数据存储为非敏感用户数据,是允许该值为true的,毕竟移机备份还是个具有相当意义的需求。
6、对外开放的组件访问推荐设置自定义权限
对于需要对外部开放组件访问的组件或者接口,可以考虑使用自定义权限来获得访问安全性。
https://developer.android.com/guide/topics/manifest/permission-element
7、密码的保存
密码不要明文保存到本地用户数据库或者键值库,如果需要,请设计一个强加密规则后存入本地库,或者设计Token和Expiration使用有期限令牌对用户数据获得读写权。
8、日志调试
推荐使用Logger等第三方日志库方便自己调试。但是也要注意,一定要给自己调用日志库加手动编译开关。而不是指望清单文件的debuggable属性为false时避开log的打印。由于市面上存在自定制ROM,并且是以userdebug模式附加了root和debug所有应用权限的手机,仍然会将所有log打印出来,因此仍然需要加独立开关。
9、webview安全
关闭对file uri的支持
10、各种密钥的保存
各种平台的密钥、AppSecret、AppKey,都要存在so库中,使用时通过JNI读取,或者通过RestfulAPI读取
11、未完待續