由于最近SHA1冲突的新闻,我想确保SHA1不再使用在我的apk签名。但我找不到一个参数在apksigner。
有没有办法指定(直接或间接)apksigner使用的摘要算法?
(在SDK 24之前,Android使用java的jarsigner
来签署apk,它有-sigalg SHA1withRSA -digestalg SHA1
这样的选项)
更新:正如Alex提到的,我发现apksigner
如何确定V1SchemeSigner.java中方案v1的签名算法。
简而言之,apksigner
根据minimumSDK
和证书的密钥类型来确定它。
SHA256withRSA
适用于最低SDK 18(Android 4.3)及更高版本SHA256withDSA
适用于最低SDK 21(Android 5.0)及更高版本SHA256withEC
适用于最低SDK 18及以上版本SHA1with*
用于较低的最低SDK级别
这是一个常见问题我写的备忘录:SHA1 Collision and Android APK Signing.
2条答案
按热度按时间ej83mcc01#
apksigner
尝试只使用安全摘要和签名算法,但它是在签名密钥施加的约束内这样做的(大小,算法)和所签名APK支持的Android平台版本,特别是JAR签名,apksigner
默认使用SHA-256或更高版本,但仅适用于仅支持API级别18或更高版本的APK(如AndroidManifest.xml
中的minSdkVersion
声明)。在早期平台上运行的APK必须使用SHA-1,因为这些早期平台不支持使用SHA-256或更高版本验证APK。对于APK Signature Scheme v2签名,仅使用SHA-256或更高版本,因为此签名方案甚至不支持SHA-1。如果您希望
apksigner
使用SHA-256签署您的APK,您可以:minSdkVersion
设置为18或更高,但这将使API级别为17及更低的Android平台在安装时拒绝APK。--min-sdk-version=18
传递到apksigner
,但这会使API级别为17及更低的Android平台在安装时拒绝APK。--v1-signing-enabled=false
传递到apksigner
,仅使用APK签名方案v2对APK进行签名,但这将使API级别为23及更低的Android平台在安装时拒绝APK。附言:即使你改用SHA-256来签署APK,Android仍然会接受带有你的软件包名称和签名证书、使用SHA-1或MD5签名的APK。因此,根据你的威胁模型,你可能需要改用从未使用过SHA-1或更弱的摘要算法的新签名密钥。这不仅适用于实际加密签名中使用的摘要算法,而且还适用于X1 M10 N1 X和X1 M11 N1 X文件中使用的摘要算法。
tzdcorbm2#
在我的实验中,我发现有些情况下
apksigner
是不可能的。即使我设置了
--min-sdk-version 28
,我也总是获得带有签名RSA和SHA1的证书。但这并没有改变任何东西--因为Android希望应用更新使用完全相同的证书。在我的实验中,更改摘要算法会使证书不同,更新无法工作。(参考:https://stackoverflow.com/a/74931130/1961303)
So it seems that there is one option left to remove SHA1: APK key rotation from Android 9 (refs: https://developer.android.com/about/versions/pie/android-9.0#apk-key-rotation )