【问题标题】:Digitally signing a shared library on Android在 Android 上对共享库进行数字签名
【发布时间】:2014-12-04 16:48:36
【问题描述】:

我正在寻找一种对共享库进行数字签名的方法,以便验证该库的真实性。我提出的解决方案是对库进行哈希处理并将其存储在加载和调用库的 Java 文件中,但问题是如果将来更新库,这将失败(除非所有使用该库的应用程序也更新)。

我在想也许可以改为将已用私钥签名的库的哈希插入到 .so 文件的末尾,以便可以信任此签名的哈希并且不需要存储在调用应用程序中以供验证。 Android API 中是否对此提供任何支持,并且以这种方式将数据插入到库中可能会导致库加载器出现问题?

【问题讨论】:

  • 在对象中嵌入签名效果不佳,因为它会更改对象,从而更改验证期间计算的哈希值。通常,它将与验证者一起分发、添加到容器中或以验证者知道忽略的方式附加。您想要在应用程序中构建的是验证签名所需的公钥。但请注意 - 根据您分发库的方式 - 将未经批准的库获取到系统上的攻击向量也可能是可以修补您的验证逻辑的攻击向量。

标签: java android java-native-interface shared-libraries digital-signature


【解决方案1】:

如果您的库没有安装在/system/lib 中,它通常由一个应用程序使用 - 将库打包到其 APK 中的应用程序,典型的更新过程将涉及 C++ 库和 Java 应用程序。因此,您的验证不需要在更新后继续存在。

另一方面,标准身份验证技术也适用于库签名。例如。添加一个新的 API “GetVersion(int salt)”,它将返回共享密钥(可能是同一个文件的哈希),用随机输入“加盐”。现在,你让逆向工程你的签名变得更加困难,因为没有任何中间人分析无法给他们提供线索。

这可能比在库文件的固定偏移处寻找签名更容易实现,并且更难解决。

无论如何,在共享对象的末尾附加任意 blob 不会导致加载器出现问题。您可以在 Android.mk 文件中添加修改 .so 文件的自定义步骤。您必须在 install 步骤期间或之后执行此操作,这会从库中删除调试信息。

【讨论】:

  • @ChrisStratton:如果我没有说清楚,我很抱歉。我提到 /system/lib 是因为作者询问了在应用程序之间共享库的问题,所以也许他正在寻找使用受信任的系统库构建和升级自定义 ROM 的方法。
  • @MilindDeore 请澄清您的问题。最有可能的是,您想就 SO 提出一个新问题,而不是用不必要的 cmets 乱扔它
猜你喜欢
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
  • 2011-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多