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