我的应用程序可以执行5个业务功能。我现在需要将其构建到应用程序的许可模型中。
我的想法是随应用程序发送“密钥文件”。该文件应包含一些加密数据,其中包含应用程序中启用哪些功能以及哪些功能未启用。我也想要半黑客证明,这样不仅任何白痴都可以找出逻辑并“破解”它。
此文件的解密版本应包含例如:
BUSINESS FUNCTION 1 = ENABLED
BUSINESS FUNCTION 2 = DISABLED.... etc
请您就如何做到这一点给我一些想法?
答案 0 :(得分:4)
虽然可以使用Rijndael完成,但您也可以尝试使用非对称方法解决问题。要求应用程序在启动时使用公钥解密小设置文件,并仅向其发送使用私钥加密的新配置文件。
根据配置文件的大小,与Rijndael算法相比,这会导致启动时性能受到影响,但即使客户端反编译程序并获取公钥,对配置文件也无关紧要因为他们没有私钥来制作新的。
当然,没有一个人认为特别是流氓客户反编译您的程序并删除所有检查......但是无论您做什么,该客户都不会支付您的产品从而使你处于收益递减和一个全新问题的位置。
答案 1 :(得分:2)
最简单的安全解决方案可能是实际使用产品的在线激活。客户将安装您的产品,输入他的钥匙(或其他购买标识 - 如果您在线购买,这可以全部集成,如果您正在销售盒子,钥匙更方便)。
然后,您可以使用此标识来确定可用的功能并发送回加密的“密钥文件”(如您所说),还可以自定义密钥(可以随机生成,密钥和密钥文件都将被存储在您的服务器上 - 与该标识相关联。)
然后,您需要确保密钥文件在其他计算机上不起作用,您可以通过让计算机发回其计算机ID并将其作为添加的盐来使用。
答案 2 :(得分:2)
我一直在考虑使用自定义构建的程序集来进行应用程序许可。密钥文件方法本质上存在缺陷。实际上,它是一堆标志,说“功能X已启用,功能Y不是”。即使我们加密它,应用程序也将内置所有功能 - 以及解密文件的方法。任何坚定的黑客都不太可能发现打破这种保护非常困难(尽管这可能足以让诚实的人保持诚实,这正是我们想要的)。
让我们假设加密的“Yay / Nay”特征标志的这种方法是不够的。更好的是实际上根本没有发布受限制的功能。使用动态装配加载,我们可以轻松地将每个受限特征中的一个或两个核心功能放入另一个装配中,并在需要时将其拉入。这些额外的“启用”程序集成为关键文件。为了最大限度地提高安全性,您可以使用私钥对其进行签名,除非签名良好,否则不要加载它们。
此外,对于每个客户,您的构建和许可流程可能包含一些难以找到的客户特定数据,这有效地将每个支持组件与该客户联系起来。如果他们选择分发它们,您可以轻松追踪它们。
这种方法优于简单的Yay / Nay密钥文件的优点是应用程序本身不包含受限模式的功能。如果没有对这些额外程序集的作用的强烈了解,它就不能被黑客攻击 - 如果黑客移除了它们的加载(因为它们会删除密钥文件),代码就无法运行。
这种方法的缺点包括补丁发布,通过使密钥文件集中的代码简单紧凑(但至关重要),可以稍微减轻补丁。根据您的分销情况,为每个客户定制构建组件可能会非常棘手。
答案 3 :(得分:1)
您可以使用Rijndael轻松实现此目的,但问题是代码将包含您当前设计中的Key。这基本上意味着有人会反汇编你的代码以找到钥匙和繁荣,再见保护。你可以通过混淆你的代码来减慢这个过程,但是如果他们想要得到它,他们就会得到它。
但是,除此之外,要回答您的问题,此代码应该适合您:
http://www.dotnetspark.com/kb/810-encryptdecrypt-text-files-using-rijndael.aspx
答案 4 :(得分:1)
我发现Perforce风格的保护方案最容易实现和使用,同时又非常防黑客。该技术使用纯文本文件,并在最后一行附加验证签名。例如:
----(file begin)
key1: value1
key2: value2
expires: 2010-09-25
...
keyN: valueN
checksum: (base64-encoded blob)
---- (file end)
您可以选择不对称(公钥/私钥)加密算法+ 哈希算法。生成您的参考公钥/私钥对。在您的程序中包含公钥。然后编写一个小的实用程序,它将获取一个未签名的设置文件并对其进行签名 - 计算文件内容的数字签名(读取设置文件,计算哈希,使用私钥加密此哈希)并附加它(例如base64编码) )作为最后一行的“校验和”。
现在,当您的程序加载设置文件时,您将读取嵌入的公钥并验证数字签名(读取文件内容,删除最后一行,计算哈希;将此值与来自最后一行base64的校验和进行比较并运行使用嵌入式公钥进行不对称解密。如果验证成功,则表示设置文件未被篡改。
我发现设置是纯文本的优点(例如,客户可以看到许可证何时到期或者他们支付了哪些功能),但是更改文件中的单个字符会导致数字化签名检查失败。此外,请记住,您现在没有随程序提供任何私人知识。是的,黑客可以对您的程序进行逆向工程,但他们只会找到公钥。为了能够签署更改的设置文件,他们必须找到私钥。祝你好运,除非你是一个三个字母的代理商......: - )。
答案 5 :(得分:0)
使用任何“加密”方法来实现此目的。 只需查看名称空间'System.Security.Cryptography'
即可上述命名空间提供了许多加密和解密功能来保护秘密数据。
您还有另一种使用注册表实现此方法的方法。 您可以将数据存储在Windows注册表中。 最好在存储到注册表之前加密数据。
答案 6 :(得分:-3)
ROT-13!
编辑:
ROT-13是一个简单的替换密码,其中每个字母被字母表中的字母前面的13个字母代替。 (注意:或者,您可以使用小于给定字符的ascii-value 13来支持超过[A-Z0-9])。
有关详细信息,请参阅wikipedia。