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上 会提示签名冲突。 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
国际算法SHA256withRSA是一种基于SHA256哈希算法RSA非对称加密算法的数字签名算法。它使用SHA256对待签名的数据进行哈希计算,然后使用RSA算法对哈希值进行加密。这种算法通常用于数据的加密和数字签名验证,可以确保数据的完整性和身份的真实性。通过私钥对数据进行签名,然后使用公钥进行验签,可以确保数据在传输过程中没有被篡改,并且确保数据的发送方身份的真实性。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [java SHA256withRSA,json数据证书加签验签](https://download.csdn.net/download/sunny_lv/12786779)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [签名算法sha256withrsaRSA数字证书公钥私钥生成,base64转码和文件日志](https://blog.csdn.net/qq_41912505/article/details/107640004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [PHP MD5withRSASHA1withRSASHA256withRSA算法签名](https://blog.csdn.net/xiayu204575/article/details/106589772)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值