在安卓系统中对共享库进行数字签名

7
我正在寻找一种数字签名共享库的方法,以便验证该库的真实性。我的解决方案是对库进行哈希处理,并将其存储在加载和调用库的Java文件中,但问题是如果将来更新库,则此方法将失败(除非所有使用该库的应用程序也更新)。
我认为可以通过使用私钥签名的库哈希值插入到.so文件末尾等方式来替代这种方法,以便可以信任这个已签名哈希值,而不需要将其存储在调用应用程序中进行验证。Android API是否支持此功能?以这种方式向库中插入数据是否可能会导致库加载器出现问题?

将签名嵌入对象并不是很好的方法,因为它会改变对象,从而改变验证过程中计算的哈希值。通常情况下,签名会与对象一起分发、添加到容器中或以某种方式附加,以便验证程序知道忽略它。你想要构建到应用程序中的是验证签名所需的公钥。但要注意,根据你分发库的方式,可能存在攻击向量,可以将未经批准的库放入系统中,并可能篡改你的验证逻辑。 - Chris Stratton
1个回答

1
如果您的库未安装在/system/lib中,则通常只有一个应用程序使用它 - 将库打包到其APK中的应用程序,典型的更新过程将涉及C++库和Java应用程序。因此,您的验证不需要在更新后继续存在。
另一方面,标准身份验证技术也适用于库签名。例如,添加一个新的API“GetVersion(int salt)”,它将返回与随机输入“混合”的共享密钥(可能是相同文件的哈希),从而使反向工程您的签名更加困难,因为没有人中间分析不能给他们任何线索。
这可能比查找库文件的固定偏移处的签名更容易实现,并且更难以解决。
无论如何,在共享对象的末尾附加任意blob都不会导致加载器出现问题。您可以在Android.mk文件中添加自定义步骤来修改.so文件。您必须在install步骤期间或之后执行此操作,该步骤会从库中剥离调试信息。

@ChrisStratton:如果我没有表达清楚,我很抱歉。我提到/system/lib是因为作者问及如何在应用程序之间共享库,所以也许他正在寻找一种构建和升级带有可信系统库的自定义ROM的方法。 - Alex Cohn
@MilindDeore请澄清你的问题。很可能,你想在SO上开一个新的问题,而不是用不必要的评论来污染这个问题。 - Alex Cohn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接