在Android上以数字方式签署共享库

时间:2014-10-09 16:46:30

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

我正在寻找一种对共享库进行数字签名的方法,以便我可以验证所述库的真实性。我建议的解决方案是散列库并将其存储在加载和调用库的Java文件中,但问题是如果将来更新库将会失败(除非所有使用该库的应用程序也都更新)。 / p>

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

1 个答案:

答案 0 :(得分:1)

如果您的库未安装在/system/lib中,它通常由一个应用程序使用 - 将该库打包到其APK中,并且典型的更新过程将涉及C ++库和Java应用程序。因此,您的验证无需更新。

另一方面,标准认证技术也适用于库签名。例如。添加一个新的API" GetVersion(int salt)"这将返回共享秘密(可能是同一文件的哈希值)," salted"随机输入。现在,你更难以对逆向工程进行签名,因为没有中间人分析不能给他们提供线索。

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

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