DH参数的目的是什么?

信息安全 tls diffie-hellman
2021-08-08 01:30:13

对于 Diffie-Hellman (DH) 密钥交换 (TLS),服务器生成一个素数p和一个生成器g,它是一个原始根模 p。

当使用 SSL/TLS(例如 nginx)设置网络服务器时,可以使用指令ssl_dhparam dhparam4096.pem
文件dhparam4096.pem可以使用生成openssl dhparam -out dhparam4096.pem 4096

这些 DH 参数的目的究竟是什么?
他们可以公开吗?(即我可以发布我的dhparam4096.pem文件吗?)

以下是我dhparam4096.pem文件的内容:
这似乎是 4096 位整数的十六进制表示,对吗?

-----BEGIN DH PARAMETERS-----
MIICCAKCAgEAsb8mBiOtYJZ3XR7f/rCXQwpAAnUPXf7l9pwjYxxy30A7rIzMTrsz
bXuhhEmzroJcDqKbu2nIzOBNO6HuyQ3n9x/ZbY5kiEt6q7UrB5jC9LwyPASZhd/F
6xLC7yqFs9sdCaXzuyMS4Ep5sPH6lOvftdsuGZZF9HriTepv/lpD1cPtab+3vHZX
IELVc2WBwVzvNRGd/SQB8RJ+NNF8IseCV/pb/tb67O1p7sn+JsD5xgNB7Lte/XjD
QBXv86aNuI2Z6zAuCiQsQ4rJuWcdnyAz0+zW9DRHz0osB1+IfHYcf4tNmvMKbC8E
u/vI+Q2WsMXkbTyhWibV2zH8cXdfsj5xpIgtbxm4G1ELGFgqyX9LD0IddXE7Md86
qwoKSTBNOyCIEZwwNfKDXY0b7zzObv7b3//J7gM323bAcm9g3uVaYBxF7ITd/jGm
AxpnF55mfhAOYemPZtNinnPAdvqf6BhZe29wfVC1yCIhg7ec9spRaFn2GgW0eL3d
q/+Ux8DJBtzKE10YyLa7bh1Dhml/xtA7rpqLL4+jg5c6lLEvSGmAZtm879NYS0za
33/2LN0/KB4z46Ro5hwqq3UIIe8oDsxdlNGb0mb9F0lKw5//J24PK/t11qMt8yuG
oKUE7TkDfwXlEBxd/ynW2/kLIjhG1JG55Vz8GWet8+ZGzfl/VQeUb9MCAQI=
-----END DH PARAMETERS-----
3个回答

这些 DH 参数的目的究竟是什么?

这些参数定义 OpenSSL 如何执行Diffie-Hellman (DH) 密钥交换正如你所说的正确,它们包括一个 field primep和一个 generator g自定义这些参数的可用性的目的是允许每个人为此使用他/她自己的参数。这可以用来防止受到Logjam攻击的影响(这实际上并不适用于 4096 位字段素数)。
那么他们是怎么定义的呢?
Diffie-Hellman 密钥交换操作如下(对于 TLS 1.2 和之前的1):

服务器 Bob 使用这些参数来计算B=g^b mod p他将 发送给自己(B,g,p)计算的客户端 Alice 她发送给 Bob,他计算. 双方将就共享密钥达成一致参数定义此密钥交换的安全性。更大的数字将使找到共享秘密变得更加困难,从而防御被动攻击者。A=g^a mod pK=B^a mod pAK=A^b mod pA^b=g^(a*b)=g^(b*a)=B^a mod ppgpK

为什么你必须预先计算它们?
找到素数p意味着找到一个值,p一个素数。则称为安全素数 找到这样的素数确实是计算密集型的,并且无法在每个连接上提供,因此它们是预先计算的。p=2q+1qp

他们可以公开吗?

的,发布它们没有风险。事实上,它们是针对涉及一些 Diffie-Hellman (DH) 密钥交换的每一次密钥交换而发送的。甚至有一些这样的参数标准化,例如在RFC 5114中。发布的唯一可能问题可能是强大的攻击者可能有兴趣对它们执行一些计算,从而使他能够执行Logjam 攻击但是,由于您的参数使用 4096 位字段素数p,因此这不是风险。
要解释为什么发布它们没有风险,您可能需要查看上面的密钥交换描述并注意参数仅用作计算的基础,但所有秘密 ( a,b) 完全独立于g,p.


1:对于 TLS 1.3,客户端首先从标准化集合中猜测服务器的参数。然后将A所有这些参数发送给服务器,然后服务器要么用B他自己的参数集的选择来响应,要么用实际支持的参数列表来响应——这可能包括这个问答所涉及的自定义生成的参数。

Diffie Hellman Key Exchange 的 openssl wiki 页面

如果 Alice 和 Bob 希望相互通信,他们首先在他们之间商定一个大素数 p 和一个生成器(或基)g(其中 0 < g < p)。

Alice 选择一个秘密整数 a(她的私钥),然后计算 g^a mod p(这是她的公钥)。Bob 选择他的私钥 b,并以同样的方式计算他的公钥。

所以 Alice 会一直拥有相同的私钥,但是对于每组 DH 参数 g 和 p,她会得到一个不同的对应公钥。


在该页面的下方,它说:

由于参数生成可能是一个昂贵的过程,这通常提前完成一次,然后在许多密钥交换中使用相同的参数集。

Diffie Hellman 参数的 openssl wiki 页面上,它说:

要使用完美前向保密密码套件,您必须设置 Diffie-Hellman 参数(在服务器端)

当使用静态 Diffie Hellman (DH)(与 Ephemeral Diffie Hellman (EDH) 相对)时,DH 参数是为服务器设置的,并且实际上可以嵌入到证书中,因此它们是公开的,请参阅此答案秘密来自爱丽丝和鲍勃的私钥。

DH 参数的目的是交换一个秘密(一个属于素数顺序组的大素数整数),该密码将用于加密会话中的消息副本。

临时 DH 提供前向安全性,这意味着会话密钥(在会话开始时交换)在会话终止时被删除。因此,攻击者无法检索两方之间交换的消息超过上一个会话(因为每个会话都有一个不同的密钥,该密钥总是在终止时被删除)。