Android SDK开发艺术探索(五)安全与校验

2024-01-21

一、前言

本篇是Android SDK开发艺术探索系列的第五篇文章。介绍了一些SDK开发中安全方面的知识,包括资源完整性、存储安全、权限校验、传输安全、代码混淆等知识。通过基础的安全配置为SDK保驾护航,探索SDK开发在安全方面的最佳实践。

防杠说明:本人认同前端没有绝对的安全,基本我们公开谈论的大部分安全策略都可以绕过,但这不能成为我们忽视安全的理由。

二、安全概览

SDK安全概览

三、资源安全

3.1、完整性检查

SDK资源完整性检查,是指在SDK开发中,对于AAR包的完整性做一些检查。实际上,对于资源的完整性、有效性检查,通常是核对其文件的摘要。SDK包也是如此,可以在发布AAR时同时发布该文件的摘要,用于核对校验。 软件包SHA-256摘要

这里也介绍简单一下另一个思路,即从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初探之敏感信息保护

五、传输安全

5.1、网络安全配置

该特性让应用可以在一个安全的声明性配置文件中灵活的自定义其Https网络安全设置,而无需修改应用代码,满足更高的安全性要求。

在AndroidManifest.xml中配置networkSecurityConfig:

<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
    <application android:networkSecurityConfig="@xml/network_security_config"
                    ... >
        ...
    </application>
</manifest> 

network_security_config文件如下:

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <domain-config>
        <domain includeSubdomains="true">example.com</domain>
        <trust-anchors>
            <certificates src="@raw/my_ca"/>
        </trust-anchors>
    </domain-config>
</network-security-config> 

以 PEM 或 DER 格式将自签署或非公共 CA 证书添加到 res/raw/my_ca 。回想起年前听到渗透测试结果时的恐惧,好家伙,自己装了个证书…不过Android7.0以上已经默认不信任用户手动安装的证书了。

这部分更多细节、功能可以参考官方文档 网络安全配置

5.2、安全环境检测

我们这里说提及的安全环境主要是指有可能对我们的业务逻辑产生影响的环境,比如挂了VPN代理、Root了手机/安装了Xposed、应用被多开、模拟器环境…

5.2.1、VPN代理检测

检测当前连接的网络是否开启VPN

//检测系统是否正在使用vpn连接
public boolean isVpnOn(Context context) {
    boolean isVpnOn = false;
    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) {
        Network activeNetwork = connectivityManager.getActiveNetwork();
        NetworkCapabilities caps = connectivityManager.getNetworkCapabilities(activeNetwork);
        isVpnOn = caps.hasTransport(NetworkCapabilities.TRANSPORT_VPN);
    }else {
        isVpnOn = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_VPN).isConnectedOrConnecting();
    }
    Log.i(TAG, "Is VPN On: " + isVpnOn);
    return isVpnOn;
} 

5.2.2、Root/Xposed/反调试/应用多开/模拟器检测

关于Root/Xposed/反调试/应用多开/模拟器的检测方法,这里推荐一个很好用的第三方库 EasyProtector 具体API这里就不贴了,参考作者的项目即可。

六、混淆与配置

6.1、手动集成

一般我们对接第三方SDK时,都会有一个混淆配置。同理,我们在发布SDK时也可以参考这类设计,提供SDK中不需要混淆的代码配置,在对接文档中集成即可。

6.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'
        }
        debug {
            minifyEnabled false
            shrinkResources false
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
} 

6.3、混淆的那些坑

以上配置看似简单,但却潜在一些坑,在最新的4.x的Android Studio中我们新建一个library module,会自动创建出两个 ***rules.pro 文件,其中 consumer-rules.pro ,自动被 defaultConfig 下的 consumerProguardFiles 所引用; proguard-rules.pro ,自动被buildType下的 proguardFiles 引用。

混淆配置的坑

那么这两者有何差别?为什么要区分开两个文件来写呢?经过充分验证,结论就是:

1、 defaultConfig 下的 consumerProguardFiles 配置的 *.pro 文件将会在library module打包成aar时,以proguard.txt的形式存在,将参与到集成这个arr的App编译中,但不参与这个library module打包成aar的编译过程;

2、 buildType proguardFiles 配置的 *.pro 文件作用与library module打包成aar的编译过程,仅作用于本module的编译混淆过程。

在实际操作中,直接将 consumerProguardFiles 配置的 *.pro 文件改为 proguard-rules.pro ,这样就能粗暴地解决掉aar编译时的混淆与apk编译时的混淆了。

但是需要特别注意的是,根据我们SDK开发设计中的最小可用性原则,应该 谨慎添加混淆规则,如无必要,勿增规则,避免对集成该aar项目的正常混淆造成干扰

七、结语

本篇主要介绍了一些SDK安全与校验方面的知识。安全是一种意识,难的不是安全,是没有意识。正如开篇提到的前端没有绝对的安全,但是安全也不能仅依靠前端,它应该是多端协同下的多层级、系统级的安全。对于开发者来说,应该有所作为,毕竟多一道防线就多一点安全。一个开发者应该拥有基础的安全意识,才能尽量避免安全事故。

题外话

随着信息技术的快速发展和互联网的普及,IT行业 成为一个非常热门的领域,也是目前就业前景非常广阔的领域之一。

IT行业是一个非常庞大和多样化的行业,包括软件开发、网络安全、数据分析、云计算等等领域。因此,就业前景也是非常广泛和多样化的,不同的领域和职位都具有不同的就业前景和发展机会。

在软件开发领域,由于软件已经成为现代社会不可或缺的一部分,因此对软件开发人才的需求也越来越大。特别是在移动应用、大数据、人工智能等领域,软件开发人才的需求更是迅速增长。因此,软件开发人才的就业前景非常广阔,尤其是那些熟练掌握多种编程语言和技术的人才。

有幸看到一篇这样一组数据。

根据这些我不得总结,it行业确实人才紧缺,

行业发展空间大,岗位非常多

网络安全行业产业以来,随即新增加了几十个网络安全行业岗位︰网络安全专家、网络安全分析师、安全咨询师、网络安全工程师、安全架构师、安全运维工程师、渗透工程师、信息安全管理员、数据安全工程师、网络安全运营工程师、网络安全应急响应工程师、数据鉴定师、网络安全产品经理、网络安全服务工程师、网络安全培训师、网络安全审计员、威胁情报分析工程师、灾难恢复专业人员、实战攻防专业人员…

职业增值潜力大

网络安全专业具有很强的技术特性,尤其是掌握工作中的核心网络架构、安全技术,在职业发展上具有不可替代的竞争优势。

随着个人能力的不断提升,所从事工作的职业价值也会随着自身经验的丰富以及项目运作的成熟,升值空间一路看涨,这也是为什么受大家欢迎的主要原因。

从某种程度来讲,在网络安全领域,跟医生职业一样,越老越吃香,因为技术愈加成熟,自然工作会受到重视,升职加薪则是水到渠成之事。

学习资料分享

当然, 只给予计划不给予学习资料的行为无异于耍流氓 ,### 如果你对网络安全入门感兴趣,那么你点击这里 ????

如果你对网络安全感兴趣,学习资源免费分享,保证100%免费!!!(嘿客入门教程)

????网安(嘿客)全套学习视频????

我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了。

img

????网安(嘿客红蓝对抗)所有方向的学习路线****????

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

img

学习资料工具包

压箱底的好资料,全面地介绍网络安全的基础理论,包括逆向、八层网络防御、汇编语言、白帽子web安全、密码学、网络安全协议等,将基础理论和主流工具的应用实践紧密结合,有利于读者理解各种主流工具背后的实现机制。

在这里插入图片描述

面试题资料

独家渠道收集京东、360、天融信等公司测试题!进大厂指日可待!
在这里插入图片描述

???? 嘿客必备开发工具 ????

工欲善其事必先利其器。学习 客常用的开发软件都在这里了,给大家节省了很多时间。

这份完整版的网络安全( 客)全套学习资料已经上传至CSDN官方,朋友们如果需要点击下方链接 也可扫描下方微信二v码获取网络工程师全套资料 【保证100%免费】

在这里插入图片描述

如果你对网络安全入门感兴趣,那么你点击这里 ????

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android SDK开发艺术探索(五)安全与校验 的相关文章

  • 如何在android中使用Ontouchevent突出显示此pdf页面

    这里我想使用android中的onTouchevent来突出显示这段文字 您可以使用 OnTouchListener 来获取事件的 x 和 y 然后将屏幕绘制为位图 并根据字母的左上角显示和字母的大小使用bitmap getPixel 看看
  • 旋转 ImageView 及其背景而不裁剪

    我已经进行了很多搜索 但找不到解决我的问题的方法 我不能使用android rotation因为我希望这个应用程序与 Android API 11 版本兼容 我的问题与此类似 在 Android 中旋转视图 https stackoverf
  • AppCompat DayNight 主题始终显示为 Light 主题?

    我正在使用 AppCompat 中引入的新 Theme AppCompat DayNight 主题版本23 2 http android developers blogspot com 2016 02 android support lib
  • 在 Android 中设置 Signalr:崩溃/挂起问题

    我跟着本教程 https whathecode wordpress com 2014 03 20 getting started with the java signalr sdk 为我的 Android 应用程序设置一个 NET 后端来实
  • 清单合并失败:属性 application@appComponentFactory

    一切都很好 但我正在尝试添加这个库https github com wdullaer MaterialDateTimePicker https github com wdullaer MaterialDateTimePicker有了这个 i
  • 鼠标在两个视图上移动,如何让它们都处理`ACTION_MOVE`事件

    我有两个视图 较大的一个在底部 较小的一个在顶部 如下图所示 现在我在 view1 view2 外部 上按鼠标 然后移动到 view2 我发现即使鼠标在移动过程中位于view2内部 view2也不会得到ACTION MOVE事件 只有vie
  • Android中每10秒显示一次数据

    我必须每 10 秒后显示一些数据 谁能告诉我该怎么做 您还可以使用另一种方法按特定时间间隔更新 UI 以上两个选项都是正确的 但根据具体情况 您可以使用替代方法在特定时间间隔更新 UI 首先为 Handler 声明一个全局变量 用于从 Th
  • Android BuildConfig 字段错误生成字符串

    在开始新项目的最后一天 我在构建配置中创建了一些变量 作为在发布和调试构建之间单独处理它们的好习惯 如下所示 buildTypes release minifyEnabled false buildConfigField String PA
  • 三星Android BLE多次读/写

    在 Samsung 4 2 到 4 3 BLE 应用程序迁移指南中 http developer samsung com ble http developer samsung com ble 它说 堆栈和 F W 的同步性质没有受到影响 那
  • GCM 条款和条件

    有谁知道在哪里可以找到有关哪些内容可以通过 GCM 通知发送以及哪些内容不可以发送的条款和条件 我似乎在任何地方都找不到任何文档 当您注册开设 Google API 帐户时 您会得到这些条款和条件 https developers goog
  • 以编程方式创建进度绘制

    我有一个场景 我需要有大量的进度条可绘制对象 我无法为所有这些创建 xml 资源 因为我希望用户选择一种颜色 然后用于动态创建可绘制对象 下面是 xml 中的一个这样的可绘制对象 我如何以编程方式创建这个精确的可绘制对象
  • 对早期设备使用 Roboto 字体

    我想在我的 Android 应用程序中使用 Roboto 字体 并确保它适用于未安装该字体的早期版本的 Android 我知道我可以通过使用 Typeface createFromAsset 然后手动设置每个 TextViews Butto
  • 如何提高加速度计和指南针传感器的精度?

    我正在创建一个增强现实应用程序 当手机面向兴趣点 GPS 位置存储在手机上 时 它可以简单地可视化文本视图 文本视图绘制在屏幕中的兴趣点位置上 它工作正常 问题是指南针和加速度计非常 变体 并且文本视图由于传感器的准确性而不断左右上下移动
  • 在视图上按下按键时不会调用 onKeyDown

    我有一个包含两个视图的活动 一个视图重写 onDraw 并正确处理 onTouchEvent 但是当我尝试检索第二个视图的 onKeyDown 时 它没有给我任何结果 相反 当我按下后退按钮或任何其他键盘按钮时 会调用 onKeyDown
  • android:configChanges 清单文件中不允许错误字符串类型

    这是我的清单文件 其中显示 android configChanges 不允许的错误字符串类型 请帮助我纠正错误 下面是我的清单文件
  • 当活动从最近的活动中删除时,优雅地清理绑定服务

    我有一个绑定服务 需要时会转到前台 这是我所拥有的简化版本 class MyService extends Service private static final ServiceConnection serviceConnection n
  • 如何使用带有 ListView 和自定义适配器的选择器来指示所选项目

    我有一个具有 ListView 的活动 并且我创建了一个自定义适配器 基于BaseAdapter 自定义适配器的 GetView 方法使用自定义布局 view context LayoutInflater Inflate Resource
  • 如何在真实设备上模拟来电? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 出于测试目的 我想在真实的 Andr
  • Android 上页面留在后台时会触发“beforeunload”事件

    我正在尝试制作一个在导航时弹出的简单加载微调器 它在导航离开时使用 beforeunload 事件显示 并在完成后使用 load 事件再次隐藏自身 问题是 当我将页面留在手机后台时 例如几个小时后 beforeunload 事件触发并显示微
  • Robotium 和系统对话框

    当我尝试与蓝牙设备配对时 会出现带有 PIN 码的系统确认对话框 有 取消 和 确定 按钮 但我无法使用 Robotium 单击它们 如何在 Robotium 中使用 Android 操作系统对话框 谢谢 这对我有用 solo clickO

随机推荐

  • 白帽子如何快速挖到人生的第一个漏洞 | 购物站点挖掘商城漏洞

    本文针对人群 很多朋友们接触安全都是通过书籍 网上流传的PDF 亦或是通过论坛里的文章 但可能经过了这样一段时间的学习 了解了一些常见漏洞的原理之后 对于漏洞挖掘还不是很清楚 甚至不明白如何下手 可能你通过 sql labs 初步掌握了sq
  • 图解python | 字符串及操作

    1 Python元组 Python的元组与列表类似 不同之处在于元组的元素不能修改 元组使用小括号 列表使用方括号 元组创建很简单 只需要在括号中添加元素 并使用逗号隔开即可 tup1 ByteDance ShowMeAI 1997 202
  • 每天10个前端小知识 <Day 5>

    前端面试基础知识题 1 typeof 与 instanceof 有什么区别 typeof与instanceof都是判断数据类型的方法 区别如下 typeof会返回一个变量的基本类型 instanceof返回的是一个布尔值 instanceo
  • 2024年华数杯国际赛B题:光伏发电功率 思路模型代码解析

    2024年华数杯国际赛B题 光伏发电功率 Photovoltaic Power 一 问题描述 中国的电力构成包括传统能源发电 如煤 油和天然气 可再生能源发电 如水电 风能 太阳能和核能 以及其他形式的电力 这些发电模式在满足中国对电力的巨
  • iprtrmgr.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个iprtrmg
  • 前端基础:回顾es6相关知识

    Author note 题记 ECMAscript is international standard of javascript ECMA 是 js的国际标准版语言 let and const 为什么之前用var现在需要用let cons
  • iPhone16或全系升级8GB内存,支持Wi-Fi 6E!

    随着新的一年到来 苹果下一代机型iPhone 16系列的爆料也越来越充实 越来越详细 从多个爆料中 我们甚至已经都够想象出下一代iPhone的基本雏形 海通国际技术分析师Jeff Pu 为我们带来了新的内容 这位分析师称 iPhone 16
  • Jenkins 插件下载速度慢、安装失败了!我教你怎么解决!

    Jenkins部署完毕 如果不安装插件的话 那它就是一个光杆司令 啥事也做不了 所以首先要登陆管理员账号然后点击系统管理再点击右边的插件管理安装CI CD必要插件 但是问题来了 jenkins下载插件速度非常慢 而且经常提示下载插件失败 真
  • ir50_32.dll文件丢失导致程序无法运行问题

    其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题 如果是新手第一时间会认为是软件或游戏出错了 其实并不是这样 其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库 这时你可以下载这个ir50 32
  • 【固定翼飞机】基于最优控制的固定翼飞机着陆控制器设计研究(Matlab代码实现)

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及文章
  • 深度好文:最全的大模型 RAG 技术概览

    本文是对检索增强生成 Retrieval Augmented Generation RAG 技术和算法的全面研究 对各种方法进行了系统性的梳理 涉及了 RAG 流程中的数据拆分 向量化 查询重写 查询路由等等 在做 RAG 的小伙伴一定知道
  • messages,CentOS 7不收集日志或不存在 /var/log/messages

    var log message var log secure等都不记录了 并且都是空文件 重启机器 reboot 无效 重启日志 systemctl start rsyslog 无效 怀疑空间不足 删除 var log messages 重
  • 图解python | 基础数据类型

    1 Python变量类型 Python基本数据类型一般分为6种 数值 Numbers 字符串 String 列表 List 元组 Tuple 字典 Dictionary 集合 Set 本文详细讲解Python中变量赋值 数据类型以及数据类型
  • 2024年金三银四网络安全考试试题

    2023年金三银四网络安全考试试题 1 关于数据使用说法错误的是 A 在知识分享 案例中如涉及客户网络数据 应取敏感化 不得直接使用 B 在公开场合 公共媒体等谈论 传播或发布客户网络中的数据 需获得客户书面授权或取敏感化 公开渠道获得的除
  • 外包干了3个月,技术退步明显。。。。。

    先说一下自己的情况 本科生 19年通过校招进入广州某软件公司 干了接近4年的功能测试 今年年初 感觉自己不能够在这样下去了 长时间呆在一个舒适的环境会让一个人堕落 而我已经在一个企业干了四年的功能测试 已经让我变得不思进取 谈了2年的女朋友
  • [C++]:11.模拟实现vector

    模拟实现vector 二 模拟实现vector 0 看一看源码SGI 1 vector h 2 stl vector h 1 构造 2 析构函数
  • 利用 LangChain 和 Neo4j 向量索引,构建一个RAG应用程序

    Neo4j 在5 11版本中将向量搜索功能完全集成到 Neo4j AuraDB 和 Neo4j 图数据库中 随后对 Neo4j 向量检索的全面支持也被集成到了 LangChain 库中 Neo4j 向量检索已成为检索增强生成 RAG 应用程
  • 嵌入式开发--STM32G4系列片上FLASH的读写

    这个玩意吧 说起来很简单 就是几行代码的事 但楞是折腾了我大半天时间才搞定 原因后面说 先看代码吧 读操作 读操作很简单 以32位方式读取的时候是这样的 data IO uint32 t 0x0800F000 需要注意的是 当以32位方式读
  • Android开发中常见安全问题和解决方案

    前言 开发APP时经常有问到 APP的安全怎么保障 应用程序被PJ了怎么办 手机被人捡去了怎么办 特别在号称 安全第一 风控牛逼 的银行系统内 移动产品安全性仍被持有怀疑态度 那我们来总结下APP安全的方向和具体知识 1 应用程序安全 2
  • Android SDK开发艺术探索(五)安全与校验

    一 前言 本篇是Android SDK开发艺术探索系列的第五篇文章 介绍了一些SDK开发中安全方面的知识 包括资源完整性 存储安全 权限校验 传输安全 代码混淆等知识 通过基础的安全配置为SDK保驾护航 探索SDK开发在安全方面的最佳实践