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