Android 签名、打包加固实践

Android 签名、打包加固实践 参考文章: [为应用签名 – developer.android.com](https://developer.android.com/studio/publish/app-signing

参考文章:

为应用签名 – developer.android.com

从事 Android 开发也有几个年头了,日常的工作中,虽然也对打包加固有所接触,但一直没有清晰的工作步骤,因为在大厂或者成熟的小公司中,都会搭建打包平台,安装包的加固,也不需要每个研发去实际操作。因此,本文为您总结 Android App 安装包的签名、打包和加固流程。

签名

Android 系统要求所有 APK 必须先使用证书进行数字签名,然后才能安装到设备上或进行更新。

计算机加密通常为密钥对:公钥和私钥,成对出现,就像是一把锁和能打开这把锁的钥匙,公钥是锁,密钥是钥匙。在 https 加密机制中,还会有证书的概念。这一部分可以自行去了解。

Android 的密钥库文件的类型是 .jks.keystore ,是用作证书和私钥存储库的二进制文件。

公钥证书.der.pem 文件,也称为数字证书或身份证书)包含公钥/私钥对中的公钥,以及可以标识持有对应私钥的所有者的一些其他元数据(例如名称和位置)。

为了避免中间人攻击, HTTPS 在浏览器中预置了 CA 证书来验证网站的身份,而 apk 打包不存在 C/S 这种架构模式,也就无需通过在客户端预设的证书来验证身份;而是可以直接通过在公钥证书中附加一些私钥的信息(名称和位置等),来查找对应的私钥。

官方文档中提供了两种密钥,用来打包和上传 Play 商店两种用途:

  • 应用签名密钥:用于为用户设备上安装的 APK 签名的密钥。作为 Android 安全更新模型的一部分,应用签名密钥在应用的整个生命周期内保持不变。应用签名密钥属于私钥,因此必须保密。不过,您可以与他人共享使用应用签名密钥生成的证书。
  • 上传密钥:在上传 App Bundle 或 APK 以通过 Google Play 为应用签名之前,您可以使用上传密钥为 App Bundle 或 APK 签名。您必须对上传密钥做好保密工作。不过,您可以与他人共享使用上传密钥生成的证书。您可以通过以下任一种方式生成上传密钥:
    • 如果要让 Google 在您选择加入计划时为您生成应用签名密钥,那么您用于为应用签名以进行发布的密钥将被指定为上传密钥。
    • 如果您在将新应用或现有应用加入计划时向 Google 提供应用签名密钥,那么您可以在选择加入计划的过程中或之后生成新的上传密钥,以提高安全性。
    • 如果您没有生成新的上传密钥,就会继续将您的应用签名密钥用作上传密钥来为每个版本签名。

使用 Android App Bundle 格式发布应用时,需要先使用上传密钥为 app bundle 签名,然后才能将其上传到 Play 管理中心,其余操作则由 Play 应用签名功能完成。对于在 Play 商店中(适用于 2021 年 8 月之前创建的应用)或其他商店中使用 APK 分发的应用,必须为 APK 手动签名才能上传。

为什么新项目没有配置签名也可以打包?

前面提到了 Android 系统要求所有 APK 都必须先使用证书进行数字签名,那么疑问来了,为什么我在 Android Studio 创建一个新项目,什么都不做也能 run 起来安装到设备上?

这是因为从 IDE 中运行或调试您的项目时,Android Studio 会自动使用由 Android SDK 工具生成的调试证书为您的应用签名。当您首次在 Android Studio 中运行或调试项目时,IDE 会自动在 $HOME/.android/debug.keystore 中创建调试密钥库和证书,并设置密钥库和密钥密码。

当然了这样做是无法发布应用的:由于调试证书由构建工具创建并且在设计上不安全,因此大多数应用商店(包括 Google Play 商店)都不接受使用调试证书为要发布的应用签名。

Android Studio 会自动将您的调试签名信息存储在签名配置中,因此您不必在每次调试时都输入此信息。签名配置是一种包含为应用签名所需全部信息的对象,这些信息包括密钥库位置、密钥库密码、密钥名称和密钥密码。

生成签名

请参考官方文档:生成上传密钥和密钥库

在项目中配置签名

在生成 keystore 文件后,在 app 目录下的 build.gradle 文件中添加 signingConfigs 配置:

android {
  	// ...
    /*必须放在 buildTypes 前面,否则 signingConfig signingConfigs.release 调用会报错,无法识别 release 属性*/
    signingConfigs {
        release {
            storeFile rootProject.file('keystore.jks')
            storePassword 'android'
            keyAlias 'key'
            keyPassword 'android'
        }
        debug {
            storeFile rootProject.file('keystore.jks')
            storePassword 'android'
            keyAlias 'key'
            keyPassword 'android'
        }
    }
  
    buildTypes {
        release {
          	// ...
            signingConfig signingConfigs.release
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }

        debug {
            // ...
            signingConfig signingConfigs.debug
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

在 signingConfigs 代码块中为不同的 build variants 添加密钥库文件的相关信息,然后在 buildTypes 代码块中启用不同的签名配置 signingConfig signingConfigs.release

这样在构建不同版本的安装包时,就会使用不同的签名进行打包。

加固

Android 的软件文件类型是 apk,说到底也是个压缩文件,通过反编译后,可以将其转换为源码,通常经过混淆等机制后反编译后的代码阅读起来十分困难,但仍不排除会被理解。也就是说,如果要做安全,需要从两方面入手:

  1. 加固:防止 apk 被反编译
  2. 混淆:增加反编译后的代码阅读理解的难度

加固的方案有两种,这里的内容参考的文章是 APK加固原理详解

  • 方式一:直接对 apk 进行加密,启动应用时通过壳程序去加载 apk 运行;
  • 方式二:仅对原 apk 的 dex 文件进行加密,启动应用时对 dex 解密,通过 DexClassLoader 进行加载。

加固技术方案这里不展开讲,后续会单独出一篇文章。朋友们可参考 《APK加固原理详解 》这篇文章。

360 免费加固实践

下面介绍 360 加固助手在 mac 上的免费加固实践流程。

下载链接:jiagu.360.cn/#/global/do…

登录后选择应用加固,

image-20230130153507103.png

然后将您的 apk 文件拖到界面中或者选择添加应用,选择你的 apk 文件,会提示你:

image-20230130154150085.png

然后进行配置:

image-20230130155035184.png

点击添加后,会自动开始加固,当加固完成后,会提示是否打开输出目录:

image-20230130155140663.png

打开后就得到了加固后的安装包了。

今天的文章Android 签名、打包加固实践分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/21949.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注