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

一 背景

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

开发者自查: 不要使用已经过时或不安全的弱算法,确保签名证书使用了更强的签名算法, 如 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上 会提示签名冲突。

相关推荐
2501_9151063212 分钟前
iOS 打包 IPA 全流程详解,签名配置、工具选择与跨平台上传实战指南
android·macos·ios·小程序·uni-app·cocoa·iphone
超低空18 分钟前
Android MediaSession深度解析:车载音乐播放器完整案例
android·架构·客户端
00后程序员张19 分钟前
iOS 混淆实操指南多工具组合实现 IPA 混淆、加固与发布治理 IPA 加固
android·ios·小程序·https·uni-app·iphone·webview
xiaoshiquan12061 小时前
as强制过滤指定依赖版本库,解决该依赖不同版本冲突
android
2501_929157683 小时前
Switch 20.5.0系统最新PSP模拟器懒人包
android·游戏·ios·pdf
用户095 小时前
Kotlin Flow的6个必知高阶技巧
android·面试·kotlin
用户095 小时前
Flutter插件与包的本质差异
android·flutter·面试
用户095 小时前
Jetpack Compose静态与动态CompositionLocal深度解析
android·面试·kotlin
聆风吟º7 小时前
【Spring Boot 报错已解决】别让端口配置卡壳!Spring Boot “Binding to target failed” 报错解决思路
android·java·spring boot
非专业程序员Ping15 小时前
HarfBuzz概览
android·ios·swift·font