.NET 加密技术用于许可证密钥?

15

我想创建一个许可证密钥,你推荐使用哪种加密算法?

基本输入将是:

公司名称
主要版本号
创建日期
到期日期
是否具有功能1:
是否具有功能2:
是否具有功能3:

例如:Acme Inc 5.0 20081102 20081102 0 1 0

相关链接:哪个内置的 .NET 加密算法最安全?


这里有一些相关的SO问题:http://stackoverflow.com/questions/79064/cryptography-algorithm 和 http://stackoverflow.com/questions/179220/best-cryptography-algorithm 和 https://dev59.com/lXVC5IYBdhLWcg3wixw0 - Thomas Owens
1
为什么这个问题被关闭了?其他的问题并没有回答到这个问题,而ASDFdotASPX的另一个问题是更加通用的。 - Rasmus Faber
重新打开。它类似于我提供的链接,但不是重复的。 - Thomas Owens
这是一个被误解的问题。那个人并不是在问如何隐藏通信以避开美国国家安全局的监控。 - Echostorm
1
我使用SLP服务器...这是微软以前的产品,现在在这里销售:http://www.inishtech.com/software-licensing-and-code-protection-products-for-net-developers/SLP-Server.aspx - makerofthings7
5个回答

11
我建议:不要花太多时间来保护你的密钥。使用字节编译语言非常容易反编译,并使应用程序跳过验证步骤。无论你的密钥有多安全,如果您的验证函数始终返回true,那么它们就没用了。序列号的作用是让诚实的人保持诚实。

哈哈哈,“非常容易反编译并使应用程序跳过验证步骤”。既然如此容易,那就来破解最新版本的HP Loadrunner或最新版本的Burp Suite,并向我们展示它是多么容易。例如,可以发布一篇博客文章作为证明,比如这里有一个关于(非常)旧版本Burp Suite的博客文章真正的问题是,你已经反向工程了多少有价值的程序? - Pacerier
“序列号存在的目的是让诚实的人保持诚实…” 这是错误的。诚实的人不需要序列号来保持诚实,一个像“除非你先付款,否则不要使用此功能”的消息框就足够了。 序列号存在的目的是让不诚实但吝啬的人保持诚实。安全问题首先是经济问题,其次才是技术问题。 - Pacerier

8
如果您需要在客户端进行验证,建议使用非对称加密。这样,您就不必将私钥分发给客户端。我会使用SHA-256和2048位密钥生成RSA签名。如果这样做,加密操作将不会成为弱点。黑客当然可以更改代码以跳过验证步骤,但没有任何加密算法能够帮助解决这个问题。
如果您需要在服务器端进行验证,我建议选择基于SHA-256的HMAC。

4
对于许可证密钥,您更关心的不是加密它,而是签名。通过签名,您可以验证到期日期和启用功能列表未被篡改。没有必要隐藏(加密)许可证密钥,因为没有威胁需要通过向最终用户隐藏许可证来减轻。
加密签名是通过对许可证进行哈希,然后使用私钥加密哈希来完成的。由于任何人都可以使用相应的公钥解密该哈希,因此任何人都可以验证许可证是否被篡改。
签名和验证的基本CryptoAPI函数分别是CryptSignHashCryptVerifySignature,请参见示例C程序:签署哈希和验证哈希签名

.Net Framework中对应的是RSAPKCS1SignatureFormatterRSAPKCS1SignatureDeformatter类。


1

你需要做4件事情:
第1步:对你的应用程序进行校验和(MD5,使用自定义md5上下文)
- MD5上下文需要加密初始化
- 与私钥/公钥加密的校验和进行比较
第2步:对正在运行的应用程序的文本段进行校验和
第3步:使用4096位RSA私钥-公钥加密许可证
第4步:加密任何关键字符串,如“错误的密钥”或“密钥正确”


MD5是一种已经被破解的哈希算法,不应再使用。 - Nayef

0

如果您想看一個Triple DES加密的例子,您可以看看我的博客文章關於在數據庫中對數據進行加密

該博客文章包含一個視頻和源代碼。

雖然它專注於在數據庫中加密字符串列,但您絕對可以修改它以在許可欄位中運行。

該源代碼是使用C#編寫的,並使用Triple DES算法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接