部署后如何在我的 .NET 代码中 "protect" 我的 public 键?

How can I "protect" my public key in my .NET code once deployed?

我正在设计我的应用程序的许可部分。它将使用来自我的许可服务器的 JWT 之类的东西来发出声明,我的代码 运行ning 在工作站上将用于启用功能。

服务器将使用其私钥对声明进行签名,客户端将使用public 密钥来验证签名。按照目前的情况,这将在 .NET 中使用 C# 完成。

如果攻击者可以用他们自己的密钥替换我服务器的 public 密钥,他们就可以设置一个假服务器来发布许可声明并启用他们无权使用的功能。

我可以采取哪些步骤使攻击者难以在 C# 中找到和替换 public 密钥?

具体来说,我是否应该使用并信任一个强大的混淆库?

我承认没有绝对的保护。如果我允许我的代码 运行 在我无法控制的机器上运行,那么只要有足够的技能、动机和资源,攻击者就能够恢复数据。我将满足于让拥有个人或小公司资源的中等技能的个人变得足够困难。

我计划调查的开源混淆器之一是 ConfuserEx

编辑:

一些响应者认为我对问题的理解方式有误。我恭敬地不同意。这个问题 有点 类似于攻击者将他们自己的证书添加到浏览器的证书分数,并设置他们自己的欺骗浏览器的流氓银行网站。

然而这里的类比不成立。问题不是 PKI 的经典问题 "how does the end user's (trusted) client verify trust in the server",而是半敌对环境中 DRM 的问题。所考虑的风险不是用户失去机密性或完整性,而是控制核心应用程序的位置、时间和方式运行。

直到现在我都没有考虑过 DRM,但我认为这是最好的描述,而且我承认这不太适合我。 DRM 通常会对用户产生负面影响,需要 developer/provider 付出大量努力,但最终还是会损坏,有时甚至是微不足道的。

不过,我觉得原来的问题仍然存在,因为我想采取合理的措施来保护我的工作。

混淆是一个很好的保护层,但仍然没有添加一个万无一失的方法来保护您的密钥。有许多程序可以对代码进行反混淆和反编译。参见 de4dot and dotPeek

我建议混淆您的 code-base,但也将密钥放入 un-managed C++ dll(Win32 项目)中。尽管在技术上仍然 可以从中获取密钥,但在我看来,它比混淆的 .NET 代码要难得多。

编辑:

正如 /u Scorpion 所提到的,该值在 C++ 库中仍然是常量。您可以更进一步,使用 AES 加密密钥。

一个public键应该是public。如果您担心攻击者会替换您应用程序中的密钥并托管他们自己的许可服务器,那么保护密钥几乎会分散您对实际问题的注意力:您的本地许可解决方案将不起作用。

试想一下,如果您确实以某种方式混淆或加密了密钥的值:即使密钥是安全的,能够对其进行编辑并对许可证服务器进行逆向工程的攻击者也可以轻松地禁用您应用程序的检查防止他们使用未经许可的功能的功能!

你的问题提出了很多问题,没有冒犯的意思,你的问题暗示你应该让其他人设计或构建许可部分(或购买一个off-the-shelf)。

问题不在于 public 密钥,而是私钥。私钥签署声明,public 密钥仅验证它。然后你开始谈论一个假的许可服务器,它似乎与最初担心有人窃取 public 密钥无关,因为假的服务器可以 return 任何东西。如果有人要创建一个假服务器,那么他们很可能能够绕过客户端软件中的许可检查,根本不需要服务器或密钥。

混淆与安全相去甚远,充其量只是一种延迟,而您提出问题的事实表明您没有足够的经验来设计此问题。

正如你所说,一旦软件在不受控制的机器上,你就无法阻止攻击者绕过保护,更有用的问题是谁可能攻击它,他们可能从中获得多少收益以及是否这值得他们花时间。如果价值高,请使用 hardware-dongle 锁定软件,这些软件由了解如何创建安全锁的人员制作,可能是您可以提供的最佳保护。您还应该考虑如何随着时间的推移改变事物,使其成为一个移动的目标。

您可以调查使用 Authenticode 签署您的 PE。这是一种被 Windows 识别的签名类型,并且完全独立于 .Net 强名称。您将使用 SignTool 为程序集签名,内容如下:

signtool.exe sign /f mycert.pfx /p pfxpassword /t "http://timestamp.verisign.com/scripts/timstamp.dll" /d "my app" /du "http://mywebsite.com" "C:\path\to\assembly.dll"

然后您可以在 run-time 处提取 Authenticode public key 并对此进行验证。

这里的优点是您正在利用当前的 PKI 来保护您的应用程序 - 有人需要购买 Verisign 证书并分发整个证书(包括私钥),导致 Verisign 可能吊销他们的证书并导致"keygen" 停止处理下一个 CRL 更新。

显然,有人仍然可以将您的应用程序反编译为 MSIL 并完全删除检查 - 混淆不会阻止这种情况,学习 MSIL 对于任何可以自己应用的人来说都是微不足道的。 您根本无法在软件层面阻止盗版,您只能阻止它。我不会费心隐藏 public 密钥,因为您当前的系统具有极好的威慑力。

如果您想惹恼客户并阻止破解者,您可以调查 hardware key.