Android 升级签名算法从SHA1withRSA 升级到SHA256withRSA

发布时间:2023年12月17日

一 背景

想到要修改这个问题 是因为收到下面整改通知 要求我们更新签名文件的签名算法,看到这个问题都懵了呀 虽然打包天天用签名文件 但是从来没关注过他呀

开发者自查: 不要使用已经过时或不安全的弱算法,确保签名证书使用了更强的签名算法, 如 SHA-2(其中包括 SHA-256 和 SHA-512)。

然后就想着查看下签名信息:

首先 查看签名信息有三种方法,

第一种使用JDK的keytool -printcert -jarfile apk

第二种 使用Android sdk build-tool 下的?apksigner 的apksigner verify -v --print-cert apk

第三种 使用jarsigner 暂时不考虑这种。

先用keytool -printcert -jarfile apk查看,还真是

再用apksigner 的apksigner verify -v --print-cert apk查看自己的apk

Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): false
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
Signer #1 certificate DN: *****
Signer #1 certificate SHA-256 digest: 123
Signer #1 certificate SHA-1 digest: 456
Signer #1 certificate MD5 digest: 789
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 1024

Signer #1 public key SHA-256 digest: 111
Signer #1 public key SHA-1 digest: 222
Signer #1 public key MD5 digest: 333

这个没有显示具体的签名算法名称,只显示了密钥算法的位数1024和类型RSA

二 :怎么办

咋办呢?第一反应是要新建一个签名文件 但是如果新建文件 那存量的APP 就没办法 升级了呀? ! 很严重~

so 开始百度?

查到Android9.0以后可以采用密钥轮替的方法更新签名信息,具体可以参考

Android使用apksigner轮转签名的小整理 - 简书

好的 那测试就开始啦

实战

1.具体的位置和准备工作??

?需要两个签名文件 一个旧的? 一个新的? 一个apk?

1:密钥轮替需要两个签名文件? 为了保证不影响升级,那么先创建一个新的签名 文件?

keytool -genkey -v -sigalg SHA256withRSA -keysize 2048 -alias your_alias -keystore your_keystore_name -validity 36500

然后开始准备轮替 :

2: 工具的存放位置(apksigner在哪里):
apksigner是Google官方提供的针对Android apk签名及验证的专用工具,
位于Android SDK/build-tools/SDK版本/apksigner.bat

我们进选一个大于28的版本进去就可以了?

D:\Sdk\build-tools\29.0.0-rc2>apksigner rotate --out /path --old-signer   --ks release.jks --new-signer --ks release2.jks
Keystore password for old signer:
Keystore password for new signer:
D:\Sdk\build-tools\29.0.0-rc2>

输入release.jks的密码,输入release2.jks的密码然后就导出了path文件,这个path文件是一个什么呢??其实就是一个二进制的文件。
但是就是找不到path的路径,其实path文件的位置是在D:\,就在我电脑的D盘根目录


下面开始签名:

D:\Sdk\build-tools\29.0.0-rc2>apksigner sign --ks release.jks --next-signer --ks release2.jks   --lineage /path   release.apk
Keystore password for signer #1:
Keystore password for signer #2:
D:\Sdk\build-tools\29.0.0-rc2>

签完名 以后 我们放进去的apk 就会重新被签名? 老规矩 再用上面的两种方式 验证

第一种

?先用keytool -printcert -jarfile apk查看,还是这样显示的? 这是没成功吗?留个疑问

第二种:发现 key size 已经成功变成2048 了 并且 成功v3的签名方式也从false? 变成了 true? 说明轮替成功了 但是 因为上面的签名算法没有显示? 啊? 那到底有没有轮替成功呢??

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
Signer #1 certificate DN: ****
Signer #1 certificate SHA-256 digest: 6
Signer #1 certificate SHA-1 digest: 5
Signer #1 certificate MD5 digest:
4
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048

Signer #1 public key SHA-256 digest: 3
Signer #1 public key SHA-1 digest: 2
Signer #1 public key MD5 digest:1

好 我们来开始验证?

1:使用签名轮替后的使用的是新的签名算法还是旧的呢 为啥keytool获取的签名信息为啥没有改变呢

我是怎么验证的呢 ?上面截图中是通过apksigner 签名后的apk? 的签名信息 虽然没有签名算法? 但是那些蓝色的信息也是通过sha256 或者 sha1 算法 以后的得到的数据啊,那我只要验证单独用新签名文件签名的apk 跟 我用密钥轮替 后的apk的信息一致? 是不是就可以证明 我轮替后的签名算法是用的新的了呢 ?

所以 我用上面新的签名文件 通过命令 单独去给一个apk签名 得到如下信息?

签名命令:

apksigner sign --ks? 新签名文件名字.jks? 7.apk

首先 keytool 查看用新的签名文件单独签名的apk 的签名信息,证明新的签名签名算法是sha256 密钥长度也是2048? 至少是符合规则的哈

其次 使用 查看apk的签名信息

apksigner verify -v --print-cert apk

得到的签名信息 跟轮替签名的 apk的签名信息一模一样 那么证明 我们用的就是新的签名算法?

Verifies
Verified using v1 scheme (JAR signing): true
Verified using v2 scheme (APK Signature Scheme v2): true
Verified using v3 scheme (APK Signature Scheme v3): true
Verified using v4 scheme (APK Signature Scheme v4): false
Verified for SourceStamp: false
Number of signers: 1
Signer #1 certificate DN: ****
Signer #1 certificate SHA-256 digest: 6
Signer #1 certificate SHA-1 digest: 5
Signer #1 certificate MD5 digest:
4
Signer #1 key algorithm: RSA
Signer #1 key size (bits): 2048

Signer #1 public key SHA-256 digest: 3
Signer #1 public key SHA-1 digest: 2
Signer #1 public key MD5 digest:1

然后 在手机里面安装一个旧的 apk? 运行起来?

再安装一个密钥轮替后的 apk? (版本高一点哈),发现可以正常安装 ,说明升级也没问题?

so 成功啦

ps? 理解的不深? 也不知道对不对? 有问题留言哈~

另: 查资料的时候 还了解到 一个 双重签名 说是可以兼容新旧版本? 但是试了以后 不行哦? 估计最开始就用双重签名可以吧 反正 如果从一个单一签名的apk 升级到 一个双重签名的apk上 会提示签名冲突。?

文章来源:https://blog.csdn.net/u013815832/article/details/134973788
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。