我们正在构建一个 Unity3D 插件。任何使用我们插件的游戏,在为某个平台构建时,还包括我们的插件,该插件以该平台的动态库形式存在。例如,当 Android apk 从 Unity 导出时,它将包含我们的库xyz.so。该库是用 C++ 编写的。
我们如何保护我们的动态库不被盗?似乎任何人都可以“解压缩”一个 apk Android 包,获取我们的库,获取导出,从我们的免费试用版获取文档,并最终使用该库而无需成为许可客户。在这个用例中是否有推荐的保护模型?
我们正在构建一个 Unity3D 插件。任何使用我们插件的游戏,在为某个平台构建时,还包括我们的插件,该插件以该平台的动态库形式存在。例如,当 Android apk 从 Unity 导出时,它将包含我们的库xyz.so。该库是用 C++ 编写的。
我们如何保护我们的动态库不被盗?似乎任何人都可以“解压缩”一个 apk Android 包,获取我们的库,获取导出,从我们的免费试用版获取文档,并最终使用该库而无需成为许可客户。在这个用例中是否有推荐的保护模型?
好吧,尽管它比使用托管代码要困难得多,但 C++ 代码可以被反汇编并因此被破坏。然而,这是一项艰苦的工作,只有在拥有大量消费者的情况下才值得。拥有这种技能的人宁愿破解最新流行的 AAA 游戏,也不愿在第三方 Unity 库上浪费时间。
话虽这么说:是的,您应该能够保护您的图书馆。只需在您的 C++ 库中有一个许可证密钥验证器。该库拒绝工作,直到它被提供一个它能够成功验证的许可证密钥。
许可证可能是
License =
{
key=[ Owner-Identification, App-Identifier ],
verification=(Signed hash of key)
}
您可以在哪里key
识别密钥的所有者,并且库也可以使用它来确保许可证仅适用于具有该特定 App-Identifier 的应用程序。是用只有你知道的私钥签名verification
的哈希。key
匹配的公钥是库已知的,可用于验证许可证是否由您创建,并且只有您自己创建。
如果您的库中有此代码并使用 c++ 混淆工具混淆您的代码,那么您应该是非常安全的。如果你不混淆,你实际上应该还是很安全的。
编辑:你甚至可以用这个模型做试验。只需将 License-Expire-Time 添加到key
,您的库就可以在该时间过去后停止工作。
一种可能的实现可能是:
一个包含key
明文的文件(以便您的代码,如果需要,即使是人类也可以阅读和理解它),还包含签名的哈希( 的哈希key
,用您的私钥加密)。
key
该代码将使用相同的哈希算法读取并计算其哈希值。它还将使用公钥解密签名的哈希。如果两个哈希值相同,则代码可以确保它key
是有效的并且可以继续检查其内容:是否key
未过期(Expire-Time),是否key
适用于此特定应用程序(App-Id)等。