完美前向保密(PFS)如何工作?

16

我正在参加一个信息安全课程,偶然发现了这个概念并被它吸引。我也查看了一些网站和维基百科上的说明,以及在stackoverflow上发布的一些帖子,但我仍然感到困惑。据我所知,在典型的HTTPS公钥交换中,浏览器和服务器使用密钥来创建会话密钥......如果有人获得了派生会话密钥的私钥,他们可以查看在此连接之间发送的所有数据,甚至是过去的。

我的理解是,在PFS中,“会话密钥”甚至没有以加密形式发送。它被保密,即使有人找到了私钥,他们也无法访问过去的加密记录信息。这正确吗?

我还想知道,如果我参与PFS交换,称为“ A”,与服务器“ B”,PFS应该与我的密钥被破坏后仍能工作,因为A和B的对话不会被破坏,因为他们不知道会话密钥。但是如果我的密钥实际上已被破解,B如何将我认证为A,例如它如何区分尝试使用我的密钥访问数据的我(A)或另一个用户(C)。


5
这个问题似乎不适合讨论,因为它涉及到加密理论。请尝试访问crypto.stackexchange.com - President James K. Polk
3个回答

43

我非常喜欢Robert Love在Quora上的回答:http://www.quora.com/What-is-perfect-forward-secrecy-PFS-as-used-in-SSL

让我们看一下在普通的非短暂情况下密钥交换是如何工作的。 我将给出一个简单的例子,假设使用Diffie-Hellman算法,并且具有简单的数学模型:

Alice(客户端)想要与Bob(服务器)进行通信。

Bob拥有私钥X和公钥Y。X是保密的,Y是公开的。

Alice生成一个大的随机整数M。

Alice使用Y加密M并将Y(M)发送给Bob。

Bob使用X解密Y(M),得到M。

现在Alice和Bob都拥有M,并将其用作他们同意在SSL会话中使用的密码,例如AES。

相当简单吧?问题在于,如果有人发现了X,则每个通信都被破解:X让攻击者解密Y(M),从而获得M。现在我们来看一下这种情况的PFS版本:

Alice(客户端)想要与Bob(服务器)进行通信。

Bob生成了一组新的公钥和私钥Y'和X'。

Bob将Y'发送给Alice。

Alice生成一个大的随机整数M。

Alice使用Y'加密M并将Y'(M)发送给Bob。

Bob使用X'解密Y'(M),得到M。

现在Alice和Bob都拥有M,并将其用作他们同意在SSL会话中使用的密码,例如AES。

(X和Y仍然用于验证身份;我将其省略。)

在这个第二个例子中,X未被用于创建共享密钥,因此即使X被破解,M也是无法发现的。但你可能会说,你只是把问题推给了X'。如果X'被知道怎么办?但这就是巧妙之处。假设X'从未被重复使用或存储,在通信时获得X'的唯一方法是对手在主机内存上有访问权限。如果你的对手具有这样的物理访问权限,那么任何类型的加密都不会对你有所帮助。此外,即使X'被某种方式破解,它也只会揭示这次特定的通信。

这就是PFS。


也许这是一个愚蠢的问题,但是新密钥 Y' 在传输过程中是否使用 Y 进行加密?还是 Y' 以明文形式发送? - Tara
1
Y和Y'都是公共的。没有必要加密它们。(使用Y进行加密的价值有限,因为只有X的所有者才能解密它。) - user1683793

10
在非PFS会话中,浏览器决定会话密钥(或者说是从中派生的密钥),并使用从服务器证书获取的RSA公钥对其进行加密。证书也用于验证服务器身份。然后服务器使用其私钥(也就是所谓的主密钥)来解密会话密钥。所有与服务器的连接都使用不同的会话密钥,但如果你拥有主密钥,你可以像服务器一样找出它们。 在PFS中,您使用诸如Diffie-Hellman之类的算法,其中不使用主密钥。在这种连接中,主密钥用于验证算法的参数。协商参数后,使用这些参数和双方的秘密进行密钥交换。参数不是秘密的,而双方使用的秘密在建立会话密钥(短暂的)之后被丢弃。这样,即使你发现主密钥,也无法发现会话密钥。但是,如果获得了密钥,则可以冒充服务器,而证书将不会作废。 要了解更多信息,请阅读有关Diffie-Hellman的文章。

0

您为每个消息生成一个新的公钥,并仅使用真实永久公钥进行身份验证。

这在其他答案中已经提到,但我只想给出一个更易于理解和具有上下文的版本。

您可以使用某人的公钥执行两件事情:

  • 验证是否由他们编写了一条消息,即验证消息签名,即验证消息的真实性。这是为了防止中间人攻击必需的。
  • 加密只有他们才能解密的消息

在许多方面,身份验证是更关键/成本更高的步骤,因为要知道给定公钥属于某人且避免中间人攻击,您需要采取以下步骤:

  • 与他们面谈并共享公钥(离开家???)
  • 通过视频与他们交谈(Deepfakes???)
  • 可信的签名提供者(集中化!)

然而,生成新密钥相对便宜。

因此,一旦您完成了这个昂贵的初始密钥验证步骤,现在您可以:

  • 要求接收者为您想要发送的每条消息生成一个新的临时公钥
  • 接收者将临时公钥通过其永久公钥签名后发送回给您。永久公钥不会加密任何内容,只会签名。无需加密发送的公钥!
  • 您使用永久公钥验证消息签名以避免中间人攻击,然后使用该临时密钥加密您的消息

消息被接收和阅读后,他们立即删除该临时私钥和解密的消息。

因此,如果他们的计算机被黑客攻击并泄漏了永久私钥,则无法解密攻击者在网络上捕获的旧加密消息,因为临时密钥用于加密它们,并且已经被删除。

但是,如果他们在泄漏后没有注意到并更改其永久密钥,则未来的消息仍然容易受到中间人攻击。


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