我可以指定apksigner使用的摘要算法吗?

时间:2017-02-27 03:52:48

标签: android apk apksigner

由于最近的SHA1冲突消息,我想确保在我的apk签名中不再使用SHA1。但是我在apksigner中找不到参数。

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

(在SDK 24之前,Android使用java' s jarsigner签署apk,其中包含-sigalg SHA1withRSA -digestalg SHA1}等选项

更新:正如亚历克斯所说,我找到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

1 个答案:

答案 0 :(得分:2)

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

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