Skip to content

构建

一般使用Android Studio build apk进行构建就可以了

签名与验签

Android APK 签名是指对 APK 文件进行数字签名,以确保其来源可信、未被篡改。在 Android 系统中,每个应用程序都需要通过签名验证才能被安装和运行。

需要签名的原因是:

  • 身份验证: APK 签名用于验证应用的身份,确保应用是由合法的开发者或发布者创建的。这有助于防止恶意方篡改应用并将其重新分发。
  • 完整性验证: APK 签名也用于验证应用的完整性。签名信息包括应用的数字摘要,如果应用在发布后被修改,其签名将失效,系统会拒绝安装或运行已被篡改的应用。
  • 信任体系: Android 系统通过信任体系来确保应用的安全性。通过数字签名,Android 系统能够验证应用是否来自经过验证的开发者,并且该应用在发布过程中未被篡改。
  • 系统权限: 一些 Android 系统功能和 API 需要应用提供数字签名,以便系统可以确认应用是否有权访问这些敏感功能。例如,通过 Google Play 服务的某些 API 需要应用的数字签名与开发者账户关联。
  • 应用更新: APK 签名还用于验证应用的更新。当应用的新版本发布时,系统可以通过比较新版本的签名与旧版本的签名来验证应用是否是同一个开发者发布的。

签名的过程一般包括以下几个步骤:

  • 生成密钥对:使用 Keytool 工具生成公钥和私钥对,Keystore 是一个加密的容器,用于存储和管理密钥,包括公钥和私钥。它通常用于 Java 应用程序开发中,其中开发者可以使用 Keytool 工具来生成和管理证书和密钥对。Keystore 可以用于实现自签名证书,也可以用于从 CA 获取签名证书。
  • 对应用程序进行签名:使用开发者的私钥对 APK 文件进行签名,生成数字签名证书(包含开发者的公钥)。
  • 将证书添加到应用程序中:将数字签名证书添加到应用程序中,以便在安装和运行时进行验证。
  • 在安装apk的时候,Android系统会读取签名信息,通过Android系统内置的根证书验证应用证书的合法性
  • 证书合法性验证通过后,使用公钥验证APK的数字签名,验证应用的摘要是否与数字签名匹配。
  • 验证通过,安装应用

与HTTPS的区别

可以看出,Android应用签名和验签的过程与HTTPS有很大区别:数字证书是使用开发者自己的私钥进行签名的,而不是CA机构私钥签名。

这是因为,Apk的签名目的主要是开发者身份应用完整性验证这两点,Android 生态系统中有大量的开发者,使用开发者自己的私钥签署应用使得开发者能够更加灵活地控制和管理他们的应用。

那么,一个与HTTPS相似的问题,如何保证开发者(在HTTPS中对应网站)公钥的可靠性呢?

应用的数字证书与内置的根证书之间可能存在一系列中间证书,这被称为证书链。系统使用内置的根证书验证整个证书链的有效性,确保应用的数字证书是由被系统信任的根证书签发的。

根据系统根证书验证开发者的公钥的合法性是通过建立数字证书链和使用公钥基础设施(PKI)的原理来实现的。

可以看出,Android系统只验证了应用数字签名的合法性,无法保证数字签名一定是真正原始开发者的。

那么假设有开发者A和开发者B,他们都向CA申请了自己的公钥和私钥,那么,对于开发者A签名的Apk,开发者B可以将里面的数字签名删除,然后用开发者B自己的私钥生成新的签名吗?

答案是:可以的!开发者B可以通过删除应用的原始签名,然后使用自己的私钥生成新的签名来重新签名APK,只不过重新签名后的应用与原来将完全失去关联,视为全新的应用,需要重新发布和上架。

在验签阶段,数字签名是可以信任的(正常申请的秘钥);开发者B的公钥也可以验证数字签名。那么,这个APK就可以正常安装。

换言之,从技术层面上,在不知道源码的情况下,可以删除一个Apk的数字签名然后重新签名。

  • 解压 APK 文件: APK 文件实际上是一个压缩文件,可以使用压缩工具(如zip工具)将其解压缩。
  • 删除原始签名: 在解压后的文件夹中,通常会有 META-INF 目录,其中包含应用的数字签名文件。删除这些签名文件,尤其是 CERT.RSA、CERT.SF、MANIFEST.MF 等文件。
  • 重新签名: 使用新的私钥对 APK 文件进行签名。这可以通过工具如 jarsigner 或 apksigner 进行,它们允许你使用指定的私钥和证书对 APK 进行签名。

作为应用的开发者A,有一些技术手段可以避免这些情况发生。

首先,可以在应用启动时进行应用完整性检查,通过验证数字签名和检查 APK 文件的完整性来实现:

  • 使用自己的公钥验证应用的数字签名,如果无法通过,就说明不是自己的私钥进行的签名,这样就可以拒绝启动。
  • APK 文件在签名后通常会生成一个摘要或哈希值,如果重新签名,则摘要应该会发生变化,这样也可以拒绝启动

其次,还可以使用第三方提供的应用加固,通过对应用程序进行安全性增强来提高应用的安全性的技术。

加固措施旨在增加应用的抗逆向工程、反编译和修改的难度,从而防止攻击者对应用进行不正当操作。

常见的加固手段有

  • 代码混淆,使反编译后的代码难以理解。这增加了逆向工程的难度
  • 加密关键代码和资源,以确保在运行时解密,并在内存中使用
  • 反调试和反监视(Anti-Debugging and Anti-Emulation): 防止应用在调试器中运行,以防止攻击者进行动态分析。此外,加固技术还可能检测和抵御在模拟器或虚拟环境中运行的尝试

应用加固并不是绝对安全的,但它可以有效地提高应用的安全性,阻碍一些常见的逆向工程和攻击尝试