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

flo*_*oop 5 java java-native-interface android shared-libraries digital-signature

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

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

Ale*_*ohn 1

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

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

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

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