防止服务器遭受中间人攻击

6
两个客户端Alice和Bob使用服务器登录并通过服务器交换消息。登录时,他们都会发送自己的公钥以存储在服务器上。当Alice想要与Bob交谈时,她会用Bob的公钥加密对称密钥,并通过服务器将其发送给Bob。
如何确保服务器不会生成自己的公钥对,而是发送给Alice而不是Bob的公钥。这样,服务器将首先解密Alice发送的内容,然后再使用Bob的真实公钥重新加密。
谢谢。
4个回答

5

由于Alice和Bob不能信任服务器,他们必须找到另一种确认彼此密钥的方法。一种可能性是依靠第三方。如果Bob信任Candice(并知道Candice的公钥),而Candice认识Alice,Candice可以签署Alice的公钥,然后将签署版本发送给Bob。这被称为信任网络


1
Candice?Trent今天病假了吗? - caf
哦,Candice不需要将签名版本发送给Bob - 她只需将其交给Alice,Alice可以通过不受信任的服务器将其传递给Bob。Bob仍然可以验证Candice的签名。 - caf

5
通过让受信任的第三方 (Verisign、您的公司、信任网络等) 签署 Bob 的证书,或者通过另一条安全路径将 Bob 的证书发送给 Alice (例如亲自交付 USB 密钥) 来获得认证。

这两种方法都涉及到了 Bob 的证书所应具备的核心要素。你只有相信 Bob 的证书是 Bob 的证书,因为你信任某个人已经对其进行了认证。这个“某人”可以是 Bob 本人,也可以是签署 Bob 的证书的受信任的第三方。你能够相信它的程度取决于你对认证机构的信任程度。


2
在密码学中,你就是你所知道的。如果你想避免中间人攻击,那么Alice必须有一个“Bob”的概念,这意味着Bob必须知道一些攻击者不知道的数据元素。在这里,你的攻击者是服务器,它理想地位于发起攻击的位置。
因此,问题是:谁是Bob?服务器如何成为“非Bob”?
例如,“Bob”可以被定义为:“Bob是一个拥有驾照上写有‘Bob’的人类”。或者:“Bob是我在酒吧遇到并喝了一杯啤酒的那个家伙”。
使用非对称加密可以将问题简化为对公钥的信任问题。Alice将使用她相信是Bob的公钥。因此,Alice只需要确保她拥有的公钥确实归Bob所有。公钥的所有权由相应私钥的控制来定义:Bob的公钥是私钥完全由Bob控制(例如,只有Bob知道该密钥,或者私钥在硬件令牌(智能卡)中 - Bob放在钱包里)。
基本解决方案是直接交换公钥。当爱丽丝和鲍勃在酒吧相遇时,他们互相交换了公钥。因此,爱丽丝可以“根据定义”信任鲍勃的公钥。为了更便于交换(特别是在喝了几杯酒之后),爱丽丝和鲍勃可以仅交换“指纹”,即计算公钥上的哈希值。这些值比公钥短(例如,RSA公钥通常超过1000位,而128位足以验证给定的公钥是否匹配)。在这种设置中,服务器拥有公钥存储库,爱丽丝和鲍勃只需重新计算指纹以确保服务器没有做假。
更先进的解决方案是使用证书,从而减轻了直接饮酒的需要。证书是一个包含身份(例如“鲍勃”这样的名称)和公钥的盒子。该盒子由认证机构(CA)签名:CA通过应用其签名来确认公钥确实属于鲍勃。如果爱丽丝知道CA的公钥,则她可以验证证书上的签名,然后信任公钥与证书中包含的身份之间的链接。
认证是信任的委托。Alice将她的信任委托给了CA;假设CA(我们称之为Charlie)去酒吧见Bob;通过证书,Charlie告诉Alice:“是的,那确实是Bob的密钥,在他喝第三杯后,他向我展示了它”。这里有点混乱,因为委托信任并不容易(特别是如果Charlie有暴饮暴食的习惯)。当一个CA为另一个CA签署证书时,委托可以进一步进行。在这种情况下,Charlie告诉Alice:“我没有见过Bob,但我见过Daphne,她可能见过Bob并充当了CA”。Alice使用Charlie颁发给Daphne的证书和Daphne颁发给Bob的证书,可以验证这个签名链。
这里的棘手之处在于,虽然艾丽丝可能认识查理并相信他有能力在受到一加仑吉尼斯啤酒的影响下正确地确认鲍勃,但艾丽丝并不认识达芙妮。在艾丽丝-查理-达芙妮-鲍勃的链条中,艾丽丝不仅必须相信查理是可靠的(他确实正确地确认了达芙妮),而且还必须相信查理不会轻信,即如果达芙妮本人不值得信任,查理会拒绝为她签署证书。在实际情况中,信任在被委托后迅速退化。

使用证书时,主要有两种可能的结构:

层次式证书认证机构(CA):有一个或少数几个“根证书颁发机构”,这些机构被所有人构造知道。CA只有在合同协议中委托给另一个CA(即使用传统标志在身份证书上签名,该标志表示:“此公钥可用于验证证书上的签名”),并规定了两个CA在认证方面的法律责任。这意味着委托是正式定义的,而且不容易。通常称为“认证策略声明”(CPS)的律师兼容性认证合同是一份长达200页的文件。
信任之网:每个人都作为CA。在缺乏“正式可信度”的情况下,每个单独的链只产生很少的信任。这意味着需要大量的链来补偿。如果Alice可以验证通过不同参与者的多个不同链路到达Bob,例如Charlie-Daphne-Bob链路、Elijah-Fiona-Bob链路和Gerald-Hillary-Ivan-Bob链路,则她将仅接受Bob的密钥。他们都是酒鬼,但是如果Alice要求具有不同证书的n条链路,则伪造的Bob必须支付许多回合才能腐败每个Alice使用的链路的至少一个参与者(如果Alice要求n条具有不同证书的链路,则攻击者必须腐败至少n个参与者)。
因此,认证业务主要是一项程序性的事务:谁是CA,CA在签发(签名)证书之前验证什么,整个过程从法律角度来看如何处理等等。这些程序本质上是复杂的,并且必须由证书格式中的细节来支持(例如标志“此公钥是CA密钥”)。目前定义的两种主要标准格式是X.509PGP。X.509对分层CA有很多支持,是一种非常混乱的标准、格式、实践和委员会。PGP(以“OpenPGP”命名的标准)没有真正支持分层CA;它是为了与信任网络一起使用。OpenPGP比X.509简单但更受限制,特别是如果您希望证书背后有强大的法律意义。
对于即时通讯服务器来说,所有这些可能都是过度的。Alice 真正想要的身份概念可能是“重复”的概念:“那个 Bob 是我昨天聊过天的那个 Bob”。Alice 事先不认识 Bob,但与他交谈一次就会在 Alice 的眼中建立起他的身份。她只是不想被另一个 Bob 愚弄。为此,“Alice 的软件保存任何新聊天者宣布的公钥,并在之后使用”这样的简单过程就可以达到目的。记住,关键问题是要正确地“定义”你所追求的身份概念。

有点啰嗦,但还是加一分。我认为阐明信任网络概念与(分层的)CA概念就足以向OP展示他的选择。 - Engineer

0

除非你控制服务器,否则无法这样做。 当然,除非你已经知道Bob的公钥,但是...我认为你现在陷入了先有鸡还是先有蛋的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接