# 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 签名的 .jks 或 .keystore 文件复制到手机上,然后在 MT 中找到该文件并打开,输入密码、别名、别名密码(与生成签名密钥时填入的信息一致),点击确定即可导入。

alt

如果你有 x509.pem 与 pk8 格式的签名密钥,直接将它们复制到 MT2 目录的 keys 文件夹内也可以完成导入

# 生成签名密钥

如果您没有现成的 .jks 或 .keystore 文件,也可以使用 MT 来生成,在 APK 签名对话框中点击「更多」即可找到功能入口:

alt

# 补充教程

# 将导入的签名密钥转化为 x509.pem 与 pk8 格式

导入签名密钥后,如果选择不加密,那么你可以在 MT2 目录的 keys 文件夹内找到对应的 .key 文件。

在本教程中是 test.key 文件

首先进入这个目录找到该文件,并使用与 test 不同的名称如 abc 新建空白文件 abc.x509.pemabc.pk8

alt

使用十六进制编辑器打开 test.key 文件,从

-----BEGIN CERTIFICATE-----

alt

选择到

-----END CERTIFICATE-----

alt

并点击复制。

返回主界面,使用十六进制编辑器打开 abc.x509.pem 文件:

alt

随便输入数字,然后双击弹出菜单,再点击粘贴:

alt

最后如图,点击保存即可:

alt

这样就得到了 abc.x509.pem 文件。

再次使用十六进制编辑器打开 test.key 文件,找到

-----END CERTIFICATE-----

跳过 4 个字节开始选择:

alt

一直选择到末尾,留出 8 个字节,点击复制:

alt

再用同样的方式粘贴到 abc.pk8 文件:

alt

这样我们就得到了 abc.x509.pemabc.pk8 文件:

alt

最后我们再测试一下文件是否有效,找一个 APK 文件进行签名,签名密钥选择 abc,能成功签名即可。

alt

如果签名出现错误,应该是操作失误导致的,建议重复一下上述步骤。