【问题标题】:Can I specify digest algorithm apksigner uses?我可以指定 apksigner 使用的摘要算法吗?
【发布时间】:2017-02-27 03:52:47
【问题描述】:

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

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

(在 SDK 24 之前,Android 使用 java 的 jarsigner 来签署 apk,其中有 -sigalg SHA1withRSA -digestalg SHA1 之类的选项)


更新:正如 Alex 提到的,我发现 apksigner 如何在 V1SchemeSigner.java 中确定方案 v1 的签名算法。

简而言之,apksignerminimumSDK 和证书的密钥类型确定。

  • SHA256withRSA 最低 SDK 18 (Android 4.3) 及更高版本
  • SHA256withDSA 最低 SDK 21 (Android 5.0) 及更高版本
  • SHA256withEC 最低 SDK 18 及更高版本
  • SHA1with* 用于更低的最低 SDK 级别

这是我为备忘录写的常见问题解答:SHA1 Collision and Android APK Signing

【问题讨论】:

    标签: android apk apksigner


    【解决方案1】:

    不直接。 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 或更高,但这会使 API 级别为 17 或更低的 Android 平台在安装时拒绝 APK。
    • --min-sdk-version=18 传递给apksigner,但这会使API 级别17 及以下的Android 平台在安装时拒绝APK。
    • 仅使用 APK 签名方案 v2 对 APK 进行签名,将--v1-signing-enabled=false 传递给apksigner,但这会使 API 级别 23 及更低级别的 Android 平台在安装时拒绝 APK。

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

    【讨论】:

      猜你喜欢
      • 2017-12-10
      • 2015-02-27
      • 2018-06-02
      • 2021-12-06
      • 2011-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-06
      相关资源
      最近更新 更多