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

相关推荐
Mr_Xuhhh35 分钟前
程序地址空间
android·java·开发语言·数据库
呆呆小雅2 小时前
C# 结构体
android·java·c#
ᥬ 小月亮4 小时前
Layui表格的分页下拉框新增“全部”选项
android·javascript·layui
sunly_14 小时前
Flutter:启动屏逻辑处理02:启动页
android·javascript·flutter
Sgq丶14 小时前
Android Studio 配置 proto
android·ide·android studio
_小马快跑_18 小时前
ConstraintLayout 中的ImageFilterView探索:处理图片圆角、亮度、饱和度、图片重叠等
android
IT-sec18 小时前
jquery-picture-cut 任意文件上传(CVE-2018-9208)
android·前端·javascript·安全·web安全·网络安全·jquery
xiaoduyyy19 小时前
【Android】RecyclerView回收复用机制
android
林北芒大果20 小时前
【Flutter】搭建Flutter开发环境,安卓开发
android·flutter
m0_7482302121 小时前
MySQL 数据库连接池爆满问题排查与解决
android·数据库·mysql