2012-01-18 33 views
2

可能重复:
License for C# desktop application如何许可我的C#应用​​程序

我要让我的程序锁之后试用了一些天,如果用户购买一个许可,可以使用该计划几个月。

我不知道一种方法来做到这一点。一个想法是在安装该程序时创建一个本地临时密钥,并在过去的日子之后将其锁定(这里的问题是用户可以更改他的计算机的日期和时间..该程序的原理将在网上使用,离线,所以我不能比较从我的服务器到计算机的日期)。

而另一件事情是,如何进行许可证服务。我可以生成大量的串行密钥,然后当用户支付我可以给他一个串行,每次程序启动时,我可以检查该串行是否在我的Web服务。

我在一条好路?有什么建议么?

+0

第2段 - 在线和办公室使用。第3段 - 检查序列是否在我的网络服务中。我在那里看到一个问题... – 2012-01-18 09:23:04

回答

1

如果这个应用程序是用C#和你想要写您自己的授权功能,您首先需要在部署之前进行模糊处理的可执行文件。这是为了阻止人们用反汇编程序读取CIL代码(存储在.exe中)。

要授权软件,您需要选择加密方法。对于这种加密,对称方法本质上等价于非对称方法(因为在任何情况下都必须提供密钥)。加密方法可以使用

public enum EncryptionAlgorithm { Des = 1, Rc2, Rijndael, TripleDes }; 

对于每种方法及其细节,请参阅维基百科。 Rijndael加密算法的设计旨在取代老化的DES算法。像DES一样,它是一个分组密码。它使用128位,192位或256位密钥,是个不错的选择。在下文中,我将假设您不会将密钥存储在代码中(硬编码),而是将其提供给一个单独的文件('产品密钥');因此您将提供两个许可证文件产品密钥以启用解密和加密的许可证文件。一旦你选择了一种加密方法,在产品密钥/初始化矢量(IV)上使用散列或算法来处理这个问题是很常见的。你需要一个128位的密钥(例如)并使用某种方法/变换对其进行加扰。然后使用密钥(为您部署软件的每个用户随机/伪随机生成)来生成IV。

然后,您使用'随机'键,IV和选定的加密方法来加密某些许可证文本(包括许可证日期)。

internal ICryptoTransform GetCryptoServiceProvider(byte[] bK, byte[] iVec){ ... } 

要使用您的方法解密文件,您必须执行相反的过程。关于授权的一点要注意的是,你不应该花太多时间担心人们破解软件。使用类似上面的方法很难,但不要花太多时间来研究日益复杂的方法,因为如果一些(不可否​​认的是非常有才华的)黑客想要破解你的代码,他很可能会这样做。此外,您必须假设用户不会违反法律并共享许可证文件!我不能评论使用外部公司运行代码许可的经验(我总是写自己的代码),但它可能是一个昂贵的选择。

我希望这有些帮助。

+1

*对于每种方法及其详细信息,请参阅维基百科*顶级建议,因为它已被黑掉。 – 2012-01-18 10:21:48

+1

@ Killercam我为你的答案顺便说一句,因为它比我的奉献更好。我很想听听你对这个相关问题的想法:http://stackoverflow.com/questions/8682525/licensing-wpf-silverlight-and-wp7-assemblies。对于桌面应用程序,我很乐意使用第三方许可解决方案,但是我需要一个跨平台的WPF SL和WP7许可组件。最好的问候, – 2012-01-18 11:56:33

+1

@ Dr.AndrewBurnett-Thompson。我已回复您的帖子。我希望这有一些帮助。请注意,我描述的方法已成功使用。它是经过一段时间的广泛研究后才开发出来的,以便如何最好地部署我们自己的应用程序。祝一切顺利。 – MoonKnight 2012-01-18 12:40:42

1

虽然它高度依赖于您的确切需求,但目标技术(Winforms,WPF,Silverlight等...)我建议使用第三方许可组件,如Quick License Manager,Licensing Pro dotNet

虽然滚动你自己的解决方案会更便宜,它被破解或规避的可能性要高得多。使用第三方解决方案意味着您有一个外部团队或公司致力于保持许可模式的安全性和可靠性。

最好的问候,

+0

使用第三方解决方案意味着破解者已经面临“保护”之前,并且可以重新使用他们的知识来更快地破坏您的应用程序:) – snemarch 2012-01-18 10:22:18

+0

@snemarch明智 - 也是一个需要考虑的问题。我想这取决于你自己的解决方案有多棒! – 2012-01-18 10:23:09

+0

我认为部署自己的解决方案时至关重要的是“产品密钥”的散列/转换。提供给代码的产品密钥 - >一些复杂的散列/变换 - >使用转换后的密钥进行解密。即使使用.NET进行混淆,对于体验黑客来说,建立CIL使用的加密/解密算法也可能相对简单。然而,在使用密钥之前使用模糊的数学散列/变换来操作密钥是该过程的强大组成部分,并且扩展了需要解决/黑客攻击的代码领域。 – MoonKnight 2012-01-18 11:40:08