我可以指定 apksigner 使用的摘要算法吗?
Can I specify digest algorithm apksigner uses?
由于最近的 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。
不直接。 apksigner
尝试仅使用安全摘要和签名算法,但它会在您的签名密钥(大小、算法)和被签名 APK 支持的 Android 平台版本所施加的限制范围内执行此操作。特别是,对于 JAR 签名,apksigner
默认使用 SHA-256 或更强的算法,但仅适用于仅支持 API 18 级或更高级别的 APK(如 minSdkVersion
在其 AndroidManifest.xml
). 运行 在较早平台上的 APK 必须使用 SHA-1,因为这些较早平台不支持使用 SHA-256 或更高强度验证 APK。对于APK Signature Scheme v2签名,只使用SHA-256或更强的,因为这个签名方案连SHA-1都不支持。
如果您希望apksigner
使用 SHA-256 为您的 APK 签名,您可以:
- 将 APK 的
minSdkVersion
设置为 18 或更高,但这将使 Android 级别为 API 17 及更低级别的平台在安装时拒绝 APK。
- 将
--min-sdk-version=18
传递给 apksigner
,但这会使 Android 级别为 API 17 级及以下的平台在安装时拒绝 APK。
- 通过将
--v1-signing-enabled=false
传递给 apksigner
,仅使用 APK 签名方案 v2 对 APK 进行签名,但这将使 Android 平台具有 API 级别 23 及更低级别在安装时拒绝 APK。
P. S. 即使您改用仅使用 SHA-256 对 APK 进行签名,Android 仍会接受使用您的包名称和签名证书并使用 SHA-1 或 MD5 进行签名的 APK。因此,根据您的威胁模型,您可能需要切换到从未与 SHA-1 或较弱的摘要算法一起使用的新签名密钥。而且这不仅是针对实际密码签名中使用的摘要算法,还有.SF
和MANIFEST.MF
文件中使用的摘要算法。
由于最近的 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。
不直接。 apksigner
尝试仅使用安全摘要和签名算法,但它会在您的签名密钥(大小、算法)和被签名 APK 支持的 Android 平台版本所施加的限制范围内执行此操作。特别是,对于 JAR 签名,apksigner
默认使用 SHA-256 或更强的算法,但仅适用于仅支持 API 18 级或更高级别的 APK(如 minSdkVersion
在其 AndroidManifest.xml
). 运行 在较早平台上的 APK 必须使用 SHA-1,因为这些较早平台不支持使用 SHA-256 或更高强度验证 APK。对于APK Signature Scheme v2签名,只使用SHA-256或更强的,因为这个签名方案连SHA-1都不支持。
如果您希望apksigner
使用 SHA-256 为您的 APK 签名,您可以:
- 将 APK 的
minSdkVersion
设置为 18 或更高,但这将使 Android 级别为 API 17 及更低级别的平台在安装时拒绝 APK。 - 将
--min-sdk-version=18
传递给apksigner
,但这会使 Android 级别为 API 17 级及以下的平台在安装时拒绝 APK。 - 通过将
--v1-signing-enabled=false
传递给apksigner
,仅使用 APK 签名方案 v2 对 APK 进行签名,但这将使 Android 平台具有 API 级别 23 及更低级别在安装时拒绝 APK。
P. S. 即使您改用仅使用 SHA-256 对 APK 进行签名,Android 仍会接受使用您的包名称和签名证书并使用 SHA-1 或 MD5 进行签名的 APK。因此,根据您的威胁模型,您可能需要切换到从未与 SHA-1 或较弱的摘要算法一起使用的新签名密钥。而且这不仅是针对实际密码签名中使用的摘要算法,还有.SF
和MANIFEST.MF
文件中使用的摘要算法。