# APK 签名

# 签名的作用

APK 签名的原理基于数字证书和非对称加密算法,其作用简单来说就两点,一是文件完整性检验,二是身份信息验证。

# 文件完整性检验

签名信息中包含文件数据的摘要信息,并且通过私钥进行加密。你可以通过公钥解密数据,并重新计算文件的摘要信息与之进行对比,来确认文件在签名之后没有经过他人的篡改。

安卓系统在安装 APK 文件时会通过以上方式对文件进行检验,如果检验不通过将会拒绝安装。因此在修改了 APK 之后需要重新进行签名才可以通过完整性检验,不过二次签名将会改变 APK 签名的身份信息,除非你有它的签名密钥。

# 身份信息验证

如果只有单纯的完整性检验那么签名也没有意义,因此其还有另外一个重要作用就是表明签名者的身份信息,该身份信息由签名时所使用的签名密钥决定。

签名密钥使用专门的工具随机生成,每次生成都不会重复,并且其原理也决定了基本不可能通过公开的签名信息来逆推得到签名密钥。因此你只要生成一个签名密钥并将它保管好不泄露,它就可以用来代表你的签名者身份,并且别人无法伪造。

在安卓系统中,首次安装的 APK 只会进行完整性检验,如果是覆盖安装,那么已安装的 APK 和待安装的 APK 的签名身份信息必须一致,否则无法安装。为避免该情况发生,我们一般会卸载掉已安装的应用再进行安装。

不过有一些特殊情况会导致在首次安装 APK 时也会进行身份信息验证,比如 APK 中引用了 signature 保护级别的权限、设置了 android:sharedUserId 属性等,具体可网上搜索,这边不过多展开。

# 总结

  1. APK 文件修改之后必须重新签名才能安装,否则无法通过完整性检验;
  2. APK 签名身份信息发生变化会导致无法覆盖安装,需要先进行卸载。

# APP 的签名检验

系统更多的只是对 APK 做完整性校验,身份校验很容易通过卸载方式来解决,因此许多 APP 为了防止自身被修改和破解,会对自身进行额外的校验,确保没有被修改。

我们一般称此类检查自身是否被修改的保护技术为签名校验,其校验原理几乎也都是基于文件完整性检验与签名身份信息验证。

不过现在有许多技术可以一键去除此类自校验,例如 MT 管理器的去除签名校验功能。如果您是 APP 开发者并且为自己的应用添加了签名校验,那么十分推荐您使用 MT 的该功能进行测试,如果可以被一键去除校验则需要考虑使用更安全的校验方式。

# 在 MT 中使用签名功能

① 在 MT 中找到 .apk 文件并点击,然后再点击「功能」-「APK 签名」即可对 APK 文件进行签名。

alt

② 在对 APK 文件进行修改时,你会看到「自动签名」选项,勾选它即可在修改 APK 后自动进行签名。

alt

长按「自动签名」可打开设置窗口:

alt

# 管理签名密钥

该功能新增于 v2.17.1 版本

点击侧拉栏工具的「签名密钥」,或者点击签名对话框中的相应的菜单按钮,均可进入签名密钥管理界面:

alt

在此界面你可以对签名密钥进行导入、导出、重命名、删除、转化保护方式等操作。