为了加密从(自定义)客户端到我们(自定义)服务器的通信,我们当前的方案有点像这样:
撇开关键材料的产生和使用方式不说,我们是否会将安全方面的任何变化改为:
换句话说,仅使用捆绑的公钥进行大厅登录,我们是否获得了增强的安全性?
最后一种选择是使用单独的登录服务器:
这些计划中是否有一项比另一项计划更差或更好?我看不出有什么很大的不同。
发布于 2012-12-31 16:30:54
在大厅和游戏服务器中不使用相同的私钥的一个潜在的显著优点是,即使一个或多个游戏服务器密钥被破坏,大厅服务器密钥(其公共部分与客户端捆绑在一起,使其难以更改)仍然是安全的。
想必,游戏服务器的攻击面比专用的大堂服务器要大得多(而且变化更频繁),因此设计您的系统使其能够从对游戏服务器的攻击中恢复是有意义的,同时使大堂服务器尽可能难以妥协。
您的第三种选择也具有这一优势,因为只有登录服务器需要知道绑定密钥的私有部分。事实上,根据“大厅”服务器正在执行的身份验证之外,将关键的身份验证功能分离到专用服务器上可能是个好主意。
另外,您的第三种选择保证客户端将无法绕过大厅/登录服务器,即使他们设法获得了游戏服务器公钥的副本(例如,从另一个已泄露的客户端)。(如果客户端以某种方式获得了另一个客户端的对称密钥,那么客户机仍然可以绕过登录服务器,但是由于这些密钥被绑定到客户机it,所以您的服务器应该能够检测到它。)根据您的用例,这可能是一种优势,也可能不是一种优势,但至少不应该伤害您。
顺便说一句,我觉得我真的应该修改这个旧的答案,注意到有一个比上面所描述的任何选项更安全(更实用)的选项:
您还需要一些撤销受损服务器密钥的机制。最简单的方法是在对公共服务器密钥进行签名之前将过期时间戳附加到公共服务器密钥,并让客户端拒绝使用过期密钥。当然,这意味着您必须在服务器密钥过期之前定期更改(或至少重新签名),这是您想要自动化的。
您还可以在您的协议中包括一个选项,例如,auth/大堂服务器向客户端发送一个客户端不应该信任的已撤销服务器密钥列表,即使这些密钥在其他情况下看起来是有效的。这至少允许快速撤销游戏服务器密钥,而不必等待它们过期。这可能是有用的,例如,如果一些游戏服务器由第三方运行,他们无法很容易地接收到自动密钥更新,使得使用非常短的过期时间对他们的密钥是不方便的。
当然,另一种选择是让第三方游戏服务器运营商拥有自己的“分支”签名密钥,由根密钥本身签名,这样他们就可以生成并签署自己的服务器密钥。当然,客户端需要能够一直跟踪这样的签名密钥链,直到捆绑的根密钥。分支密钥需要携带一些(签名的)元数据,以指示哪些服务器是有效的,这样第三方就不能生成和签署自己的大厅/服务器密钥。
不过,好的一点是,您不必自己实现这些特性,因为它们都是公钥基础设施模型的一部分,用于TLS (和DTLS),该协议是web浏览器用来安全连接到堆栈Exchange (和任何其他HTTPS网站)的协议。虽然TLS是一个非常复杂的协议(由于功能的历史积累),您确实不想自己实现它,但是您可以使用大量的TLS库。现在,您的语言运行库很可能已经绑定了一个。(如果它可以从https:// URL中获取数据,那么它可以,或者使用与您的操作系统捆绑在一起的数据。)
当然,您仍然需要学习如何配置您的TLS库以满足您的需要(例如,只信任您自己的根证书,并禁用您不想要的任何遗留特性),以及如何生成和签名TLS密钥,这本身就是一项重要的任务。但是,这肯定比从零开始就单独实现安全通信协议容易得多。
https://security.stackexchange.com/questions/26305
复制相似问题