我正在设计我的应用程序的许可部分。它将使用我的许可服务器中的JWT之类的内容来发出我在工作站上运行的代码将用于启用功能的声明。
服务器将使用其私钥对声明进行签名,客户端将使用公钥来验证签名。目前看来,这将使用C#在.NET中完成。
如果攻击者可以用自己的公钥替换我的服务器公钥,他们可以设置虚假服务器来发布许可声明并启用他们无权使用的功能。
我可以采取哪些措施让攻击者难以在C#中查找和替换公钥?
具体来说,我应该使用并信任一个强大的混淆库吗?
我认识到没有保护是绝对的。如果我允许我的代码在我无法控制的机器上运行,那么只要有足够的技能,动力和资源,攻击者就能够恢复数据。对于拥有一个人或小公司资源的中等技术人员,我会满意。
我打算调查的其中一个开源混淆器是ConfuserEx。
修改
有些响应者认为我以错误的方式解决了这个问题。我恭敬地不同意。问题是 little 类似于攻击者将自己的证书添加到浏览器的证书分数,并建立自己的欺诈浏览器的流氓银行银行网站。
然而这里的比喻失败了。问题不是PKI的经典问题,"最终用户(可信)客户端如何验证服务器中的信任度,而不是半恶意环境中DRM的信任度。所考虑的风险不是损失用户的机密性或完整性,而是控制核心应用程序的运行位置,时间和方式。
到目前为止,我还没有考虑过DRM,但我认为这是最好的描述,我承认这并不适合我。 DRM通常会对用户产生负面影响,并且需要开发人员/提供商的大量努力,并且最终仍然会破坏,有时甚至是琐碎的。
尽管如此,我觉得最初的问题仍然存在,因为我想采取合理的措施来保护我的工作。
答案 0 :(得分:3)
您可以调查使用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"
然后,您可以在运行时提取Authenticode public key并对此进行验证。
此处的优势在于您利用当前的PKI来保护您的应用程序 - 有人需要购买Verisign证书并分发整个证书(包括私钥),导致Verisign可能撤销其证书并导致“ keygen“停止进行下一次CRL更新。
显然,有人仍然可以将您的应用程序反编译为MSIL并完全删除检查 - 混淆不会阻止这一点,并且学习MSIL对于任何可以自我应用的人来说都是微不足道的。 你根本无法阻止软件级别的盗版,你只能阻止它。我不打算隐藏公钥,因为你当前的系统是一种极好的威慑力。
如果您想惹恼客户并阻止破解者,您可以调查hardware key.
答案 1 :(得分:2)
公钥应该是公共的。如果您担心攻击者会更换应用程序中的密钥并托管自己的许可证服务器,那么保护密钥几乎会分散实际问题的注意力:您的本地许可解决方案将无效。
想象一下,如果你以某种方式对密钥值进行模糊处理或加密:即使密钥是安全的,能够编辑密码并对许可证服务器进行逆向工程的攻击者也可以轻松地禁用对应用程序功能的检查。阻止他们使用未经许可的功能!
答案 2 :(得分:1)
混淆是一个很好的保护层,但仍然不会添加一个万无一失的方法来保护您的密钥。有许多程序可以对代码进行反混淆和反编译。请参阅de4dot和dotPeek。
我建议对代码库进行模糊处理,同时将密钥放在未管理的C ++ dll(Win32项目)中。尽管从技术上来说仍然可以从中获取密钥,但IMO比模糊的.NET代码要难得多。
修改强>:
正如Scorpion所提到的那样,该值在C ++库中仍然是常量。您可以更进一步,使用AES加密密钥。
答案 3 :(得分:1)
你的问题提出了很多问题而没有意义上的冒犯,你的问题意味着你应该让其他人设计或建立许可部分(或购买一个现成的)。
问题不是公钥,而是私钥。私钥签署声明,公钥只验证它。然后,您开始讨论假的许可服务器,这似乎与最初关于窃取公钥的人有关,因为假的服务器可以返回任何内容。如果有人要创建一个假的服务器,那么他们可能会绕过客户端软件中的许可检查而根本不需要服务器或密钥。
缺乏安全性,这是最好的延迟,而你问这个问题的事实表明你没有足够的经验来设计这个。
正如你所说,一旦软件在一台不受控制的机器上,你无法阻止攻击者绕过保护,更有用的问题是谁可能会攻击它,它们可能从中获得多少以及是否会值得他们的时间。如果价值很高,请使用硬件加密狗来锁定软件,这些软件是由了解如何创建安全锁的人员制作的,并且是您可能提供的最佳保护。您还应该考虑如何随着时间的推移改变事物,使其成为一个不断变化的目标。