我可以指定 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和证书的密钥类型来确定。

这是我为备忘录写的常见问题解答: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 或较弱的摘要算法一起使用的新签名密钥。而且这不仅是针对实际密码签名中使用的摘要算法,还有.SFMANIFEST.MF文件中使用的摘要算法。