使用主密钥进行加密的客户端身份验证

本文关键字:客户端 身份验证 加密 主密钥 | 更新日期: 2023-09-27 18:16:28

这是一种常见的、受人尊敬的模式吗?

第二个问题:我的上下文的最佳加密标准?

上下文:我有一个发送JSON数据到RESTFul service的windows服务。在JSON有效载荷中是身份验证凭证(密码和用户名),但我仍然必须考虑注册用户篡改有效载荷的其他"数据驱动"部分。

我的解决方案:从源代码中使用私钥/主密钥加密有效负载,尽可能混淆。这将验证客户端(除非主密钥被破坏)。

编辑:我的服务收集网络延迟数据。我不想收集手工编辑的数据值。我意识到,由于网络性能/延迟的不稳定/不断变化的性质,用户可以简单地拔掉他们的连接,或者将他们的连接隐藏到我的客户端没有足够的带宽/资源来完成它的工作。这些都是我无法用我所拥有的知识和时间来解释的事情。然而,我确实认为我可以保护服务不受手工编辑的有效负载的影响。

使用主密钥进行加密的客户端身份验证

我想做的第一件事是澄清你的期望。

数据有两个方面对你很重要:

  • 身份验证 -发送给您的数据来自授权的、未修改的程序
  • 完整性 -发送给您的数据在传输过程中未被修改。

完整性问题更容易解决,只需让您的程序使用到服务器的SSL连接。您甚至不需要使用由普通CA之一签名的证书,事实上,不使用可能会更好!你可以为你的应用创建一个CA,然后签署证书自己将运行在网络服务器上,私人CA。如果你这样做你可以硬编码的公钥CA的程序,只允许连接到服务器由私人CA签署的证书。这样做将有助于防止有人设置MITM SSL代理(例如小提琴手)编辑数据,同时传播。

身份验证是一个更难解决的问题。您需要防止虚假客户端或修改过的真实客户端连接到您的服务器并发送虚假数据,这不是一个容易解决的问题。如果您的软件运行在攻击者可以运行任意代码的设备上,则问题是无法解决。不可能的原因是用户可以附加一个调试器,一步一步地检查代码并复制您的过程。"解决"这个问题的唯一方法是在不允许用户运行任何东西的东西上运行你的程序,任何运行的软件都必须首先由第三方审查(比如未越狱的手机)。

无论你如何"缓解"这个问题,你不需要让它变得不可能,只要足够困难,任何恶意的用户都不会觉得值得去克服你设置的障碍。

你可以做一些事情来增加攻击者的难度:

  • 所有的消息都是用你想隐藏的秘密密钥签名的。
  • 在代码上使用代码混淆器,使其更难进行逆向工程。
  • 在SSL连接中使用客户端证书,并让您的服务器拒绝任何没有客户端证书的连接。
  • 一个比你更有经验的顾问,使你的代码更难逆向工程。

还有很多事情可以做,但这就是我想了几分钟就想到的。

所以把这一切归结起来,如果你不太担心,只是使用标准SSL,这可能会阻止75%的篡改。如果您更关心,可以使用自定义CA技巧来阻止任何SSL MITM攻击,可能会使您达到80%。但如果你想要超过80%,这就变得非常困难,在某些时候,你需要停下来问自己"我投入的时间/精力/金钱是否值得阻止另一个人向我发送错误数据?"或者100个人中有20个人给我发送错误数据,10 5 1个呢? "

如果RESTFul服务是您自己的,您可以在其上启用windows身份验证(或使用windows auth部署它的另一个实例),然后对用户进行身份验证,最好是他们属于一个角色(或组)。这样你就没有证书或密钥来搞乱,它是安全的。