我已经实现了一个 C# 程序集来验证应用程序的许可证。问题在于将其发送给客户,他们可以很容易地找到我们用来加密字符串的密钥。
签约
对应用程序进行签名有点痛苦,因为正在使用的几个组件没有签名和编译。所以我们必须手动反汇编,再用snk文件重新组装。装配加载是一种连锁反应。我想澄清只有正在加载的直接程序集才需要签名?从这些附属程序集进一步加载的程序集也需要签名?
混淆
社区版并没有真正混淆字符串。代码基本上是可见的。我应该去专业版吗?
我对此很陌生。请帮忙。
我想指出一个问题,我相信您在尝试保护您的软件时会意识到这一点。由于将运行应用程序的计算机必须能够“看到”您使用的所有代码和数据,因此其他人总会有某种方式对您的应用程序进行逆向工程。用于保护您的软件的所有密钥和机密都将在随附的数据和程序集中可用...
签名(强命名)用于阻止其他开发人员将您的关键程序集(许可证验证)替换为他们控制的允许他们绕过您的保护的程序集。由强命名程序集加载的所有程序集本身必须是强命名的。这样做的原因是,否则其他人可以用实际上破坏许可证验证功能的新实现来替换次要依赖项之一(在链下游的非强命名程序集)。
是的,您必须将所有程序集命名为更下游的所有程序集。我从经验中知道这可能会很痛苦,因为许多免费库不是作为强命名程序集分发的。在许多情况下,您可以使用 Ilmerge 合并两个 DLL,然后对生成的组合 dll 进行强命名来解决此问题。在此处查看示例 ilmerge 调用。
有可用的免费混淆工具可以正确混淆字符串,否则是的,您必须使用更高级别的大多数付费混淆工具。我个人喜欢的工具是Eazfuscator,它功能齐全且免费。除了混淆之外,Eazfuscator 还支持合并程序集和强命名。
自己实施许可证验证既麻烦又容易出错。我建议您查看其他替代方案,或者根本不进行许可证验证,因为它为您的软件增加了一定程度的维护和复杂性,这实际上可能不会提供任何经济利益。或者查看现成的许可证实施,例如这个小选择(按初始价格顺序):
这只是可用的一小部分,搜索网络将提供许多现成的解决方案。
免责声明:我开发了上面的“简单软件许可”产品,作为Donationcoder 新年编程挑战的一部分。