前文指路↓↓↓
实际生产中的 Android SDK开发总结(一)https://www.jianshu.com/p/ff9362d243a2
实际生产中的 Android SDK开发总结(二)https://www.jianshu.com/p/362116211655
实际生产中的 Android SDK开发总结(三)https://www.jianshu.com/p/919a54601310
实际生产中的 Android SDK开发总结(四)https://www.jianshu.com/p/133097271280
安全与校验
一、前言
本章介绍SDK开发中安全方面的知识,包括资源完整性、存储安全、权限校验、传输安全、代码混淆等知识。
通过基础的安全配置为SDK保驾护航,探索SDK开发在安全方面的最佳实践。
防杠说明:本人认同前端没有绝对的安全,基本我们公开谈论的大部分安全策略都可以绕过,但这不能成为我们忽视安全的理由。
二、安全概览
3.1、完整性检查
SDK资源完整性检查,是指在SDK开发中,对于AAR包的完整性做一些检查。实际上,对于资源的完整性、有效性检查,通常是核对其文件的摘要。SDK包也是如此,可以在发布AAR时同时发布该文件的摘要,用于核对校验。
这里也介绍简单一下另一个思路,即从SDK代码中检测资源的方法。众所周知,AAR在编译的时候是完全被合并APK中了,校验AAR摘要的思路可以说就这样断了。
但是我们可以通过校验AAR中的资源,如raw、assets目录下的文件。由于这两个目录下的文件在编译时不会被压缩,因此编译前后文件内容不会改变,其摘要也不会变,适合用来在资源校验。
至于摘要检验方案,可以简单在Java层面做,也可以在so里做,校验的时机与策略就更多选择了,这里就不展开讲了。
3.2、警惕资源覆盖造成的安全问题
Android Studio 会将Library模块中的资源与Application模块的资源合并。App Module的资源将会覆盖Library Module中的同名资源。正因为有此特性,我们不得不对SDK的资源进行保护,避免由于一些意外因素导致资源覆盖,从而引起与预期不一致的软件行为。
我们提到的资源主要包括常见res、assets目录下所有的文件、在对文件或资源进行命名时,务必添加唯一性的前缀或其他唯一性的命名方案。
凡事都有两面性,这一特性也为我们替换SDK资源,进行个性化改造提供了一种思路。
四、存储安全
在安全存储这方面,主要还是考验开发者的意识,看到这里的朋友不妨回头检查下手头的陈旧代码,说不定就有敏感信息明文存储,直接裸奔的问题。
4.1、SP安全存储
SharedPreferences采用xml文件格式来保存数据, 该文件所在目录位于/data/data//shared_prefs/,如果直接将账号密码或个人敏感信息存储进去,手机root后就可以轻松获取。因此,存储时尽量考虑简单做一层加密逻辑。无论是SharedPreferences还是数据库,都要避免明文敏感数据存储。
另外,SharedPreferences存储一些配置信息时也要配置好访问权限,如私有的访问权限 MODE_PRIVATE,避免配置信息被篡改。
4.2、SO安全存储
由于Java是解释性语言,而Java的混淆是没法混淆常量的。但是我们又不可避免地在前端存储一些密钥对,那么怎么存储才比较安全呢?建议往SO里存,不仅需要把密钥存储于SO,还需要把加解密逻辑甚至传输逻辑放置于SO,才能较好地保护代码逻辑。
之前也简单写了一篇文章,有兴趣可以参考下JNI初探之敏感信息保护
https://zhuanlan.zhihu.com/p/34902225
五、传输安全
5.1、网络安全配置
该特性让应用可以在一个安全的声明性配置文件中灵活的自定义其Https网络安全设置,而无需修改应用代码,满足更高的安全性要求。
在AndroidManifest.xml中配置networkSecurityConfig:
<?xml version="1.0" encoding="utf-8"?><manifest … >
<application android:networkSecurityConfig=“@xml/network_security_config”
… >
…
network_security_config文件如下:
<?xml version="1.0" encoding="utf-8"?> example.com以 PEM 或 DER 格式将自签署或非公共 CA 证书添加到 res/raw/my_ca。回想起年前听到渗透测试结果时的恐惧,好家伙,自己装了个证书…不过Android7.0以上已经默认不信任用户手动安装的证书了。
这部分更多细节、功能可以参考官方文档网络安全配置
https://developer.android.com/training/articles/security-config.html?hl=zh-cn
五、混淆与配置
5.1、手动集成
一般我们对接第三方SDK时,都会有一个混淆配置。同理,我们在发布SDK时也可以参考这类设计,提供SDK中不需要混淆的代码配置,在对接文档中集成即可。
5.2、SDK内置
为了提高接入体验,能否将SDK中的混淆配置也打包进aar中,让项目自动配置SDK的混淆文件呢?答案是肯定的,我们可以指定consumerProguardFiles属性,自定义引入的混淆规则,即可将*.pro文件打包进入aar中,项目打包时就会自动合并该配置文件。值得一提的是该属性只镇对library有效,对app无效。
consumerProguardFiles配置如下:
android {
compileSdkVersion 29
buildToolsVersion “29.0.3”
defaultConfig {
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName “1.0”
consumerProguardFiles “proguard-rules.pro”//将Library混淆配置打包进AAR,将在app构建时参与混淆
testInstrumentationRunner “android.support.test.runner.AndroidJUnitRunner”
}
buildTypes {
release {
minifyEnabled true
shrinkResources false
signingConfig signingConfigs.release
proguardFiles getDefaultProguardFile(‘proguard-android.txt’), ‘proguard-rules.pro’
一、网安学习成长路线图
网安所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
二、网安视频合集
观看零基础学习视频,看视频学习是最快捷也是最有效果的方式,跟着视频中老师的思路,从基础到深入,还是很容易入门的。
三、精品网安学习书籍
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、网络安全源码合集+工具包
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
五、网络安全面试题
最后就是大家最关心的网络安全面试题板块
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!