Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#_.net_Obfuscation - Fatal编程技术网

C# 混淆硬编码的许可证密钥

C# 混淆硬编码的许可证密钥,c#,.net,obfuscation,C#,.net,Obfuscation,我在代码中使用了一些第三方Dll,它们需要许可证密钥才能工作 调用时需要将许可证密钥传递到方法中,否则这些方法将不起作用 但是,我已经用C#编写了代码,这意味着可以通过反编译代码来检索此许可证密钥 有什么方法可以防止此许可证字符串被反编译吗?这里有一个简单的方法,不需要加密就可以停止许可证的纯文本视图: 将字符串存储在代码中,并在使用前进行一些替换,例如: string LicenseCode = "croftycot"; // Use license code CallUsingLicens

我在代码中使用了一些第三方Dll,它们需要许可证密钥才能工作

调用时需要将许可证密钥传递到方法中,否则这些方法将不起作用

但是,我已经用C#编写了代码,这意味着可以通过反编译代码来检索此许可证密钥


有什么方法可以防止此许可证字符串被反编译吗?

这里有一个简单的方法,不需要加密就可以停止许可证的纯文本视图: 将字符串存储在代码中,并在使用前进行一些替换,例如:

string LicenseCode = "croftycot";

// Use license code
CallUsingLicense(LicenseCode.Replace("o","a")); // Change to real code: craftycat
如果需要使用正则表达式、将几个字符串混合在一起等,则可能会变得更复杂。

(添加作为答案,因为消息太长,无法添加注释)


无法完全阻止对该字符串的访问,只能使其更难。即使你加密了它,你的程序也需要解密的能力,这意味着任何足够熟练的人都可以访问和重用解密机制,以获得清晰格式的密钥。或者他们甚至可以从内存中读取解密的密钥。

您可以将许可证密钥存储在app.config中,然后对其进行加密:


这可能会让你最轻松地花最少的钱。

不要太担心它。如果您的应用程序可以访问该密钥,那么任何有权访问二进制文件并有足够时间的人都可以获得该密钥

请记住,并非您的许可证计划存在风险,而是第三方的许可证计划,因此您必须依赖适用法律。如果有人对你的应用程序进行反编译并获得了对密钥的访问权,那么他们就是违法的,这是你无法阻止的


您的应用程序拥有使用该第三个库的合法权利,违反该库必须依法处理,而不是受保护,并且违反了第三方许可计划的条款。你可以进入一定的长度来保护它,但最终责任不在你,因为数据无法得到完全保护(你的应用程序需要知道该密钥,因此,在某个时候,该密钥将以纯文本形式提供给任何有权访问代码的人来选择)。即使应用程序完全是用汇编语言编写的,也是如此。

在您的许可协议中添加强烈的措辞,禁止反编译和/或使用您在其自己的软件中获得的任何许可证。要求用户以电子方式接受这些条款。在您自己的服务器上记录接受这些条款的每个用户的时间戳和IP地址


如果您想添加一些基本的模糊处理,那么它也可以。但最主要的一点是,作为该组件的授权再经销商,您正在共同努力防止其他人使用您的密钥。

好吧,您需要对其进行混淆!下一个问题是你想怎么做?您已经尝试过什么?假设许可证密钥是以明文形式存储的字符串,则无论使用何种语言,都可以轻松检索到它。非托管代码可以让您对其进行加密存储,并使解密的反向工程变得更加困难,但如果没有加密,这是毫无意义的。是的,它是以纯文本存储的。我还没有尝试过任何东西,因为我不确定什么是可能的。我所做的任何加密都是毫无意义的,因为一些“密码”密钥需要存储在代码中才能解密!!此外,即使使用加密和非托管代码,也很容易获得许可证密钥:我使用镜像第三方DLL的方法创建DLL。我用我的代码覆盖第三方DLL并运行你的程序。我不需要做任何艰苦的工作:你的代码将解密许可证密钥并用它调用我的函数——你已经把密钥放在一个盘子上交给了我。这里的问题是第三方库生成器选择的方法。如果他们希望您以明文形式传递许可证,那么您就以明文形式传递许可证。我认为,如果他们选择这种方式,你不会被认为有任何违规行为,这将如何避免@jon在上面的评论中概述的简单破解方案?我没有说会。为什么会投否决票?我知道这是一个便宜的解决方案,但传递纯文本许可证密钥也是如此。。。看起来很合适。我正在寻找一种方法来混淆我的硬编码钥匙,发现了这个。它给了我一个如何做到这一点的基本想法。谢谢。你不能很好地加密字符串,有很多方法,但如果像@Xavier Poinas所说的那样,你只能让它变得更难,所以让它更难获取字符串总是有益的/更好的,然后让它不加密,因为如果它被加密到获取代码非常麻烦的程度,这可能会让他们忘记它,继续前进。这是一个有效的答案。。。投票结果为+1。