美文网首页
Android 签名基础知识

Android 签名基础知识

作者: Dapengyou | 来源:发表于2023-01-29 16:11 被阅读0次

文章大纲:

  • Android 为什么要签名
  • keystore的生成
  • Android 怎么签名
  • 查看 apk 是否签名
  • 查看 Apk 的MD5值以及MD5不显示时的解决办法

Android 为什么要签名

在安装 apk 时,需要确保 apk 来源的真实性,以及 apk 没有被第三方篡改。为了解决这一问题,Android官方要求开发者对 apk 进行签名,所谓的签名就是对apk进行加密的过程。

keystore的生成:

在签名之前要生成 keystore 文件来存储密钥

(1)分阶段生成:
keytool -genkey -alias yushan(别名) -keypass yushan(别名密码) -keyalg RSA(算法) -keysize 1024(密钥长度) -validity 365(有效期,天单位) -keystore 指定路径/yushan.keystore(指定生成证书的位置和证书名称) -storepass 123456(获取keystore信息的密码) 回车输入相关信息即可;

 keytool -genkey -alias test -keypass testmima -keyalg RSA -keysize 1024 -validity 365 -keystore /Users/xxx/Desktop/test.keystore   

或者:

keytool -genkey -v -keystore test.keystore -alias test -keyalg RSA -validity 365 -storepass 123456
image

(2)一次性生成:
keytool -genkey -alias test -keypass test -keyalg RSA -keysize 1024 -validity 365 -keystore 指定路径/test.keystore -storepass 123456 -dname "CN=(名字与姓氏), OU=(组织单位名称), O=(组织名称), L=(城市或区域名称), ST=(州或省份名称), C=(单位的两字母国家代码)"(中英文即可)

keystore信息的查看:

keytool -list -v -keystore test.keystore -storepass 123456

image

参数说明:

  • -genkey 【生成密钥对】
  • -alias 【别名】
  • -keypass 【私钥旧密码】
  • -keyalg 【关键算法】
  • -keysize 【密钥长度】
  • -validity 【有效时长,以天为单位】
  • -keystore 【密钥存储库位置】
  • -storepass 【密钥库密码】
  • -dname 【指定证书拥有者信息】

一般在公司会在项目中的 keystore 目录下创建一个 key.properties 文件,来记录 keystore 关键信息,里面的内容是:

key.store=keystore/test.keystore 
key.store.password=123456
key.alias=test
key.alias.password= testmima
key.sigalg=RSA

Android 怎么签名

通过使用 Java 自带的 keytool 和 jarsigner 工具或 apksigner 工具(android 11)进行签名。

使用 jarsigner 签名

/Library/Java/JavaVirtualMachines/xxx.jdk/Contents/Home/bin

需要进入到 jarsigner 所在的位置,通过以下命令可以对名为 test 的 apk 签名:
jarsigner -verbose -keystore test.keystore【keystore路径】 test.apk 【apk 名称】test【别名】

如何查找 jdk 位置

java -version 可以查看 java 版本
java -verbose 可以查看 jdk 路径,和其他信息
java -verbose

java -verbose

签名时遇到的问题

在android 11的设备上安装时 可能会出现:
Failure [-124: Failed parse during installPackageLI: Targeting R+ (version 30 and above) requires the resources.arsc of installed APKs to be stored uncompressed and aligned on a 4-byte boundary] 的问题

以上问题的原因:
是关于zip 4字节对齐,请参考zipalign

解决方法:
使用 apksigner 对其签名

假设需要被签名的文件为:source.apk

  • 先进入 /Users/xxx/Library/Android/sdk/build-tools/30.0.3 路径中
  • 先删除了客户的v1签名,即删除 META-INF目录(META-INF目录下存放的是签名信息,可能报找不到META-INF/* ,不重要)
    zip -d source.apk META-INF/*
  • 获取4KB对齐apk(source_4.apk 是对齐后的结果文件)
    zipalign -v 4 source.apk source_4.apk
  • 查看是否结果文件是否对齐 (成功后会报:Verification succesful)
    zipalign -c -v 4 source_4.apk
  • 然后通过 apksigner 签名,不能在使用 jarsigner 签名
    apksigner sign --ks (签名地址) --ks-key-alias (别名) --out (签名后的apk地址) (待签名apk地址)
  • 密码库短语是:keystore 的 password (上文的 123456)

查看 apk 是否签名

查看source_4.apk 是否签名,是什么类型的签名
apksigner verify -v source_4.apk

查看 Apk 的MD5值以及MD5不显示时的解决办法

  • 将以 .apk 结尾的 APK 文件更换为 .zip 文件
  • 解压 zip 文件找到 META-INF/xx.RSA 文件
  • 命令查看 MD5 信息
    keytool -printcert -file 【xx.RSA文件所在路径】

有的时候 看不到 MD5 值,可以使用命令行:
jadx-gui 目标文件.apk
中的 APK signature 查看MD5 签名、SHA-1 签名、SHA-256 签名信息

例如:


看不到 MD5 值 通过 jadx-gui 查看 MD5

xx.RSA文件是签名文件,它的命名如果不指定名称则自动截取别名中前8个字符
一般上传到市场平台的时候,被提示解析失败,没有签名文件,可能就是缺少了这个文件。

缺少 xx.RSA 文件的原因

缺少 xx.RSA 文件的原因,大概率是因为没有选中 V1 这种签名方式。

V1 vs V2

V2这种签名方案是 Android 7.0引入的,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。具体请看 这里 。 而V1适用于所有android版本的机型,但在Android7.0及以上会缺少针对未授权 APK 文件更改的保护;所以只选V2,Android7.0以下的机型会报错,同时选V1,V2,适用所有机型。

命令行打包默认 V1,V2 是都选中的,如果不放心可以在 build.gradle 里做设置

在 app 的 build.gradle 的 android 标签下加入如下:

 signingconfigs {
        debug {
            v1signingenabled true
            v2signingenabled true
        }

        release {
            v1signingenabled true
            v2signingenabled true
        }
    }

相关文章

网友评论

      本文标题:Android 签名基础知识

      本文链接:https://www.haomeiwen.com/subject/peayhdtx.html