5

由于最近的 SHA1-collision 新闻,我想确保 SHA1 不再用于我的 apk 签名。但是我在apksigner中找不到参数。

有没有办法指定(直接或间接) apksigner 使用的摘要算法?

(在 SDK 24 之前,Android 使用 javajarsigner对 apk 进行签名,其中有类似的选项-sigalg SHA1withRSA -digestalg SHA1


更新:正如亚历克斯提到的,我发现如何在V1SchemeSigner.javaapksigner中确定方案 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

4

1 回答 1

4

不是直接的。apksigner尝试仅使用安全摘要和签名算法,但它会在您的签名密钥(大小、算法)和正在签名的 APK 支持的 Android 平台版本所施加的约束内这样做。特别是,对于 JAR 签名,apksigner默认使用 SHA-256 或更高版本,但仅适用于仅支持 API 级别 18 或更高版本的 APK(如其声明中所述minSdkVersionAndroidManifest.xml。在早期平台上运行的 APK 必须使用 SHA-1,因为这些早期平台不支持使用 SHA-256 或更高版本验证 APK。对于 APK Signature Scheme v2 签名,仅使用 SHA-256 或更强,因为此签名方案甚至不支持 SHA-1。

如果您想apksigner使用 SHA-256 对您的 APK 进行签名,您可以:

  • 将 APK 设置minSdkVersion为 18 或更高,但这将使 API 级别为 17 或更低的 Android 平台在安装时拒绝 APK。
  • 传递--min-sdk-version=18apksigner,但这会使 API 级别 17 及以下的 Android 平台在安装时拒绝 APK。
  • 仅使用 APK Signature Scheme v2 对 APK 进行签名,通过传入--v1-signing-enabled=falseapksigner但这会使 API 级别 23 及以下的 Android 平台在安装时拒绝 APK。

PS 即使您切换到仅使用 SHA-256 对 APK 进行签名,Android 仍将接受使用您的包名称和签名证书、使用 SHA-1 或 MD5 签名的 APK。因此,根据您的威胁模型,您可能需要切换到从未与 SHA-1 或更弱的摘要算法一起使用的新签名密钥。这不仅适用于实际加密签名中使用的摘要算法,也适用于.SFMANIFEST.MF文件中使用的摘要算法。

于 2017-02-27T16:35:02.623 回答