跨平台应用开发进阶(五十二):安全合规之Android APP完整性校验机制探究

一、前言

Android系统开放免费,开发者和用户都趋之若鹜。用户已经习惯了Android应用的这种免费午餐,但背后却隐藏着巨大的安全隐患。

在对APP进行渗透测试时,要求提供APP是否具备完整性校验机制,防止被重签名和二次打包(采用混淆验证签名服务器端验证等技术防范二次打包等;)

注⚠️:APK的唯一标识取决于包名和签名。

二、二次打包

什么是二次打包? 二次打包流程:破解者需要对APK文件做反编译分析,反编译为smali代码,并对某些关键函数或者资源进行修改,再次编译为apk文件并重签名。

二次打包会篡改签名,通过签名前后的变化可以检测是否被二次打包。

二次打包主要用到3个工具:apktooldex2jarjd-gui

  • apktool:反编译利器;

  • dex2jar:将dex文件反编译成jar文件(java代码)工具,用于解读代码;

  • jd-gui:打开jar文件工具;

三、解决措施

3.1 混淆

可通过在IDE配置混淆规则。

uni-app实现的话,支持js/nvue文件原生混淆加密,考虑到加解密的性能损耗,所以应选取项目中比较重要的js/nvue文件。

注⚠️:uni-appjs运行在独立的jscore中,而不是webview中,所以不受iOS平台WKWebview不支持原生混淆的限制。 uni-appvue页面中的js,是整体编译到一个大js文件中的,它经过编译,已经不再是vue源码,但还不是乱码。对这个统一的大文件进行混淆会有影响性能。 所以uni-app只支持独立混淆nvue/js文件。

HBuilderX 2.6.3+版本开始,uni-app项目使用v3编译器支持对vue页面中引用的js文件进行原生混淆。

manifest.json文件中添加要混淆的js文件列表:

shell 复制代码
"app-plus": { 
    "confusion": {  
        "description": "原生混淆",  
        "resources": {  
            "common/test.js" : {}
        }   
    },  
    // ...  
}

vue文件中引用混淆的js文件:

javascript 复制代码
import test from '../common/test.js';
//test.join();  //调用引用js中的方法

提交云端打包 配置好原生混淆的文件列表后,需要提交云端打包,注意在App云端打包对话框中需要勾选"对配置的js文件进行原生混淆"

注⚠️:为保证加密数据的安全性,HBuilder加密算法和key不对外公开,因此离线打包无法支持原生混淆。 熟悉原生的开发者可将敏感信息存放于原生代码中,再与js进行交互。

对安全性要求较高的开发者,除了对前端js进行加密外,还应该对整个apk再进行一次加固。市面上很多加固服务可以选择,比如腾讯云乐固360加固宝、爱加密等。

3.2 签名验证

3.2.1 什么是apk签名

签名是摘要与非对称密钥加密相相结合的产物,摘要就像内容的一个指纹信息,一旦内容被篡改,摘要就会改变,签名是摘要的加密结果,摘要改变,签名也会失效。Android APK签名也是这个道理,如果APK签名跟内容对应不起来,Android系统就认为APK内容被篡改了,从而拒绝安装,以保证系统的安全性。

应用程序的作者使用自己的私钥签名APK文件,并将签名与公钥一起发布到APK中,这个过程称之为签名 。当应用程序被安装时,用发布的公钥去解析签名,并与文件的hash进行比对,这个过程叫验签

3.2.2 为什么需要签名

在消息通信时,必须至少解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改。

签名机制主要有两种用途:

  • 使用特殊的key签名可以获取到一些不同的权限;
  • 验证数据保证不被篡改,防止应用被恶意的第三方覆盖;

防止被二次打包的一种方法是进行签名验证。Android安全的基石之一是所有的app都必须经过数字签名。APP二次打包时需要经过反编译------>修改源码------>二次打包------>二次签名,所以攻击者要对开发者的apk进行代码恶意篡改,重新打包时必须重新进行数字签名,这样就破坏掉了原有的数字签名。所以攻击者肯定会用另一个秘钥进行重新签名,所以可以将签名信息事先存储至服务端,如果在app中启动时对签名进行校验,就能识别app是否被重新二次打包过,识别出被二次打包后对用户进行提示,防止用户关键信息泄露或被攻击。

注⚠️:可记录证书指纹中SHA1码,将此SHA1码存储到服务端中,作为app是否被重新签名的验证凭据。

此方法只能简单校验apk是否被篡改过,而且证书指纹直接写在java代码中也容易被反编译看到破解,甚至修改判断逻辑。更好一点的改进方式是将证书指纹及判断逻辑都用ndk开发,放到so库里面。

3.3 服务端验证

3.4 核文件完整性校验

二次打包前后apk关键文件hash值比较,判断是否被修改。

可以将app中重要文件的hash值存储到服务器,在app启动时计算重要文件的hash值与服务器进行对比。

3.5 APK加固+核心方法保护

应用第三方专业APP安全防护加固平台可实现APK加固,免费版的加固层级较浅,仅针对个人开发者,企业级APP建议升级至企业版加固方案。

加固后smali文件与未加固的变化很大,极大增加了反编译代码阅读难度。而且再用apktool进行打包时会报错,不能成功进行打包。真正起到了防止二次打包的作用。通过签名校验保护,能有效避免应用被二次打包。

四、拓展阅读

相关推荐
bloxed11 分钟前
前端文件下载多方式集合
前端·filedownload
余生H17 分钟前
前端Python应用指南(三)Django vs Flask:哪种框架适合构建你的下一个Web应用?
前端·python·django
LUwantAC25 分钟前
CSS(四)display和float
前端·css
cwtlw29 分钟前
CSS学习记录20
前端·css·笔记·学习
界面开发小八哥34 分钟前
「Java EE开发指南」如何用MyEclipse构建一个Web项目?(一)
java·前端·ide·java-ee·myeclipse
米奇妙妙wuu1 小时前
react使用sse流实现chat大模型问答,补充css样式
前端·css·react.js
傻小胖1 小时前
React 生命周期完整指南
前端·react.js
梦境之冢2 小时前
axios 常见的content-type、responseType有哪些?
前端·javascript·http
racerun2 小时前
vue VueResource & axios
前端·javascript·vue.js
m0_548514772 小时前
前端Pako.js 压缩解压库 与 Java 的 zlib 压缩与解压 的互通实现
java·前端·javascript