消费者方有3台服务器(A <-> B <-> C),其中2台是我们的应用程序(B(Node.js),C(Python))。服务器之间的所有通信均由带有TLS的WebSocket处理。 C未连接到A。我不希望使用者能够运行假B或C服务器并将其连接到真实C或B服务器。
还有外部D许可证服务器,可以通过Internet进行访问。
那么保证服务器身份的最佳方法是什么?
答案 0 :(得分:1)
如果这些程序是您的客户在其拥有和托管的计算机上运行的程序,而客户是您要防范的攻击者,那么实际上是没有办法做到这一点。
您可以编写一个简单的质询-响应协议,其中B和C只需知道彼此的公钥即可验证对方是否知道自己的私钥。>
但是您要在哪里存储该私钥?该程序可以访问它的某个位置,这意味着您的客户可以访问它的某个位置。
当然,您可以尝试混淆密钥。如果没有人关心您的系统,那么这很好用,但是如果没有人关心,则您无需执行任何操作。如果破解您的系统对某人有价值,他们会找到一种方法来挖掘关键。
此时您正在参加军备竞赛:每次有人找到您的钥匙时,您都必须想出一种新的方法来对它们进行加密,以使它们重新开始。
除非您可以要求客户在其所有服务器上保持最新状态,否则即使这样也行不通。否则,一旦我从1.3.4版中挖出密钥,就可以继续运行服务器C的1.3.4版和我自己的假服务器B。
如果您可以强制服务器与您在互联网上运行并控制的另一台服务器进行通信,则可以使握手更困难(也更难以坚持使用旧版本),但仍然遥不可及。实际上,这只是将攻击面转移到修改服务器上,因此它们不执行上游检查。您在这里所说的基本上是Windows激活或在线游戏验证,当然,人们已经破解了。
在很多情况下,仍然值得做一些事情:
但是,在这一点上,我们并不是在谈论业务问题,因此,与在编程站点上的一般性回答相比,可以从可以咨询您有关业务的正确问题的安全顾问那里获得更好的建议。