Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/272.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我怎样才能获得一个;启用的功能“;我的程序的许可证文件?_C#_Encryption - Fatal编程技术网

C# 我怎样才能获得一个;启用的功能“;我的程序的许可证文件?

C# 我怎样才能获得一个;启用的功能“;我的程序的许可证文件?,c#,encryption,C#,Encryption,我的应用程序可以执行5项业务功能。我现在需要将其构建到应用程序的许可模型中 我的想法是随应用程序一起提供一个“密钥文件”。该文件应包含一些加密数据,这些数据涉及应用程序中哪些函数已启用,哪些未启用。我也希望它是半防黑客的,这样就不仅仅是任何白痴都能理解逻辑并“破解”它 此文件的解密版本应包含以下内容,例如: BUSINESS FUNCTION 1 = ENABLED BUSINESS FUNCTION 2 = DISABLED.... etc ----(file begin) ke

我的应用程序可以执行5项业务功能。我现在需要将其构建到应用程序的许可模型中

我的想法是随应用程序一起提供一个“密钥文件”。该文件应包含一些加密数据,这些数据涉及应用程序中哪些函数已启用,哪些未启用。我也希望它是半防黑客的,这样就不仅仅是任何白痴都能理解逻辑并“破解”它

此文件的解密版本应包含以下内容,例如:

   BUSINESS FUNCTION 1 = ENABLED
   BUSINESS FUNCTION 2 = DISABLED.... etc
----(file begin)
key1: value1
key2: value2
expires: 2010-09-25
...
keyN: valueN
checksum: (base64-encoded blob)
---- (file end)
请你给我一些如何做的想法好吗?

ROT-13

编辑:

ROT-13是一种简单的替换密码,其中每个字母都被字母表中其前面的13个字母替换。(注意:或者,您可以使用小于给定字符的ascii值13来支持[A-Z0-9]以上的字符)


有关更多信息,请参见。

使用Rijndael可以相当轻松地实现这一点,但问题是,代码将包含当前设计中的密钥。这基本上意味着有人会分解你的代码来找到密钥和保护。你也可以通过混淆你的代码来减缓这个过程,但同样,如果他们想得到它,他们会得到它

但是,撇开这一点不谈,为了回答您的问题,此代码应该适用于您:


使用任何“加密”方法来实现这一点。 只需查看名称空间“System.Security.Cryptography”

上面的名称空间提供了许多加密和解密函数来保护机密数据

您有另一种方法使用注册表实现此功能。 您可以在windows注册表中存储数据。
最好在将数据存储到注册表之前对其进行加密

当然可以使用Rijndael来完成,但您也可以尝试一种不对称的方法来解决这个问题。要求应用程序在启动时使用公钥解密小设置文件,并仅向其发送使用私钥加密的新配置文件

根据配置文件的大小,与Rijndael算法相比,这将在启动时导致性能下降,但即使客户端反编译程序并获取您的公钥,对于配置文件也不重要,因为它们没有创建新配置文件的私钥


当然,这些都没有考虑到反编译程序并删除所有检查的恶意客户端。。。但不管你做什么,这个客户都不会为你的产品付费,这将使你处于收益递减的境地,这是一个全新的问题。

最简单的安全解决方案可能是实际使用产品的在线激活。客户将安装您的产品,输入其密钥(或其他购买标识——如果您在线购买,这一切都可以集成,如果您销售的是一个盒子,则密钥更方便)

然后,您可以使用该标识来确定哪些功能可用,并发回一个加密的“密钥文件”(如您所称),同时还发回一个自定义密钥(可以随机生成,密钥和密钥文件都将存储在您的服务器上——与该标识相关联)


然后,您需要确保密钥文件在其他计算机上不起作用,您可以通过让计算机发回其机器ID并将其用作添加的salt来做到这一点。

我一直在考虑使用定制的程序集进行应用程序许可。关键文件方法本身就有缺陷。实际上,它是一堆标志,表示“功能X已启用,功能Y未启用”。即使我们对其进行加密,应用程序也将内置所有功能,以及解密文件的方法。任何坚定的黑客都不太可能发现打破这种保护非常困难(尽管这可能足以让诚实的人保持诚实,这才是我们真正想要的)

让我们假设这种加密的“Yay/Nay”特性标志的方法是不够的。更好的做法是根本不提供受限制的功能。使用动态装配加载,我们可以轻松地将每个受限特性中的一个或两个核心功能放入另一个装配,并在需要时将它们拉入。这些额外的“启用”程序集将成为密钥文件。为了获得最大的安全性,您可以使用私钥对它们进行签名,并且除非签名良好,否则不会加载它们

此外,对于每个客户,您的构建和许可过程可能包括一些难以找到的特定于客户的数据,这些数据有效地将每个启用程序集与该客户联系起来。如果他们选择分发它们,您可以轻松地跟踪它们

与简单的Yay/Nay密钥文件相比,这种方法的优点是应用程序本身不包含受限模式的功能。如果黑客不知道这些额外的程序集是做什么的,它就无法被黑客攻击——如果黑客删除了它们的加载(就像他们删除密钥文件一样),代码就无法运行


这种方法的缺点包括补丁发布,通过使keyfile程序集中的代码简单紧凑(但很关键),补丁发布在某种程度上得到了缓解。根据您的发行场景,为每个客户定制组装可能会很棘手。

我发现Perforce风格的保护方案最容易实施和使用,同时也非常防黑客攻击。该技术使用一个纯文本文件,最后一行附有验证签名。例如:

   BUSINESS FUNCTION 1 = ENABLED
   BUSINESS FUNCTION 2 = DISABLED.... etc
----(file begin)
key1: value1
key2: value2
expires: 2010-09-25
...
keyN: valueN
checksum: (base64-encoded blob)
---- (file end)
您可以选择一种非对称(公钥/私钥)加密算法+哈希算法。生成您的参考公钥/私钥对。在程序中包含公钥。然后编写一个小的实用程序,它将接受一个未签名的设置文件并对其进行签名-计算文件内容的数字签名(读取设置文件,co