Unity 打包APK签名用法原理及META-INF文件夹

先介绍下签名的概念,知道的略过。在消息通信时,必须解决两个问题:一是确保消息来源的真实性,二是确保消息不会被第三方篡改。在安装Apk时,同样需要确保Apk来源的真实性,以及Apk没有被第三方篡改。为了解决这两个问题,开发者对Apk进行签名:在Apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。

一、APK的Jar签名过程——META-INF文件夹

apk有两种签名方式,分别是jar签名和v2签名,jar签名也叫做v1签名,可以通过apksigner verify -v XXX.apk命令查看apk是使用哪种签名方式:

C:\Android\android-sdk\build-tools\28.0.3>apksigner verify -v  D:\apktool\apktool\dlc7.apkVerifiesVerified using v1 scheme (JAR signing): trueVerified using v2 scheme (APK Signature Scheme v2): falseNumber of signers: 1C:\Android\android-sdk\build-tools\28.0.3>

通过提示可以看到这个apk只用了Jar签名。

META-INF文件夹主要有三个文件:MANIFEST.MF、CERT.SF、CERT.RSA

.MF文件的内容是 APK 包中每个文件的名字及每个文件的** SHA1 哈希摘要**。

.SF文件 保存的是刚刚生成的MANIFEST.MF文件的SHA1 哈希摘要,以及 MANIFEST.MF 文件中每一个条目的SHA1****哈希摘要。

.RSA文件是二进制文件。这个文件保存了签名者的证书信息,以及对CERT.SF文件的签名。
整个apk签名是在apk中写入一个“指纹”。指纹写入以后,Apk中有任何修改,都会导致这个指纹无效,Android系统在安装Apk进行签名校验时就会不通过,从而保证了安全性。

二、签名文件校验过程

先看校验Verification,在使用安装apk的时候 会有一步签名校验过程,如下图右边的Verification:

扫描二维码关注公众号,回复: 13309687 查看本文章

1.提取数据data部分,通过一个hash函数加密算法,计算出一个固定长度的hash值,假设其值为A(数字摘要)。

2.提取签名signature部分,通过一个公钥进行解密,得到假设其值为B。

3.比较这两个值是否一致。如果一致就是通过校验了。

加密算法 和 公钥 都是存在证书中的。而证书也是直接从apk中提取的。
在这里插入图片描述

再反过来看签名Signing部分,在打包制作apk的时候 会有一步签名Signing过程,如上图左边所示:

1.Certificate数字证书会打包到apk中,数字证书是身份认证机构(Certificate Authority)颁发的,包含了以下信息:

1)证书颁发机构,证书颁发机构签名,证书绑定的服务器域名,证书版本、有效期——用来确保APK来源是可靠的值得信任的。
2)签名使用的加密算法(非对称算法,如RSA),公钥——上图Hash<–>Signature之间的加密解密过程。
3) 等等

三、签名相关命令

● jarsigner签名
jarsigner -keystore keystore_file -signedjar signed.apk unsigned.apk alias_name -storepass pwd

● apksigner签名
java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk

● 查看keystore文件
keytool -list  -v -keystore keystore_file -storepass pwd

● 查看apk证书
keytool -printcert -jarfile apk

● 查看DER格式证书(META-INFO/CERT.RSA)
openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text

● 查看PEM格式证书
openssl x509 -in cert.x509.pem -text -noout

● apksigner检查apk是否签名,以及查看证书SHA1值
apksigner verify -v --print-certs

四、keytool 密钥和证书管理工具

keytool 是个密钥和证书管理工具。它使用户能够管理自己的公钥/私钥对及相关证书,用于(通过数字签名)自我认证(用户向别的用户/服务认证自己)或数据完整性以及认证服务。在JDK 1.4以后的版本中都包含了这一工具,我安装的位置是C:\Program Files\Java\jdk1.8.0_291\bin\keytool.exe

cd打开这个文件夹,命令行输入keytool,出来命令使用规则,有导出 -export 导入 -import,还有比如查看一个已经签过名的apk签名(证书内容):

keytool -printcert -file XXXX.RSA
keytool -printcert -jarfile XXXX.apk

五、Unity生成APK使用的默认证书

unity没有设置过证书打出来的apk也是包含签名的。
查看在playersetting里选择了Use Existing Keystore,默认选的是unsigned(debug)的。那证书文件在哪里呢?windows下是在:C:\Users<用户名>.Android\debug.keystore
在这里插入图片描述

mac机也是在\Users<用户名>.Android下不要默认是隐藏文件夹(用command+shift+.显示出来就能看到)

控制台输入keytool -list -keystore debug.keystore查看该密钥的信息(这个key的密码是:android )

六、查看apk的签名-证书指纹

查看apk的签名其实就是apk中的证书的签名,
解压apk,找到META-INF/xxx.RSA,命令行输入

keytool -printcert -file XXXX.RSA

打包时候的证书文件的指纹

keytool -list -v -keystore xxx.keystore -storepass 密码

七、META-INF文件中.SF和.RSA文件缺失问题

在这里插入图片描述

1、因为打包过程中需要使用JDK中的keytool.exe,所以如果JDK配置有问题会导致.SF和.RSA缺失。
2、Player设置中的MiniMumAPI Level选项必须 等于或小于23(Android 6.0)
在这里插入图片描述

打包成功后,用压缩工具打开APK,在APK 的META-INF文件夹下可以看到下图两个文件,说明签名加密成功。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_43505432/article/details/117993160