我正在设计应用程序的许可部分。它将使用我的许可服务器中的JWT之类的东西发出声明,称我在工作站上运行的代码将用于启用功能。
服务器将使用其私钥对索赔进行签名,而客户端将使用公钥来验证签名。就目前而言,这将在.NET中使用C#完成。
如果攻击者可以用自己的服务器替换我的服务器的公钥,则他们可以设置伪造的服务器来发布许可声明并启用他们无权使用的功能。
我可以采取哪些步骤使攻击者很难在C#中查找和替换公钥?
具体来说,我应该使用并信任模糊处理库吗?
我知道没有任何保护是绝对的。如果我允许我的代码在我无法控制的机器上运行,那么攻击者只要具备足够的技能,动力和资源,就可以恢复数据。我将以个人或小型公司的资源为中等技能的个人提供足够的辛苦。
我计划研究的开源混淆器之一是ConfuserEx。
编辑:
一些响应者认为我遇到了错误的方法。我谨不同意。这个问题有点类似于攻击者将自己的证书添加到浏览器的证书分数中,并建立了他们自己的欺骗浏览器银行网站。
但是,这里的类比失败了。问题不是PKI的经典问题,即“最终用户的(受信任的)客户端如何验证服务器中的信任”,而是在半敌对环境中的DRM问题。考虑的风险不是失去用户的机密性或完整性,而是控制运行核心应用程序的位置,时间和方式。
到目前为止,我还没有考虑过DRM,但是我认为这是最好的描述,并且我承认那对我不适合。DRM通常会对用户产生负面影响,需要开发人员/提供者付出巨大的努力,但最终还是会失败,有时甚至是微不足道。
尽管如此,我仍然认为原始问题仍然存在,因为我想采取合理的步骤来保护自己的工作。
您可以研究使用 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 Code Online (Sandbox Code Playgroud)
然后,您可以在运行时提取Authenticode 公钥并对此进行验证。
这里的优点是,您正在利用当前的 PKI 来保护您的应用程序 - 有人需要购买 Verisign 证书并分发整个证书(包括私钥),导致 Verisign 可能撤销其证书并导致“keygen”停止进行下一个 CRL 更新。
显然,有人仍然可以将您的应用程序反编译为 MSIL 并完全删除检查 - 混淆不会阻止这种情况,并且学习 MSIL 对于任何可以自己应用的人来说都是微不足道的。您根本无法在软件层面阻止盗版,您只能阻止它。我不会费心隐藏公钥,因为您当前的系统具有极好的威慑力。
如果您想惹恼客户并阻止破解者,您可以研究硬件密钥。