在 TLS 服务器中使用相同的 DH 参数有什么影响?

信息安全 tls diffie-hellman
2021-08-11 09:06:44

对于 DHE 密码,如果没有配置自定义 DH 参数,nginx 会将 Diffie-Hellman 参数硬编码为使用基数 2 和固定的 1024 位素数(模数)。

这些参数是公开的(在 TLS ServerKeyExchange 消息中以明文形式发送),更改质数是否会以某种方式增加 TLS 连接的安全性?我对不同质数的影响感兴趣,而不是位数。

更改 DH 参数是否还有其他副作用,例如与客户端的兼容性问题?Apache 谈到了在 Java 7 和更早版本中使用较大的素数导致的问题,但我无法在 OpenJDK 1.7.0_40 中重现这一点。)

2个回答

与其他人/服务器共享相同的 DH 参数没有已知的不良副作用。这实际上是椭圆曲线DH 中的常见情况,因为生成自己的曲线比为经典 DH 生成自己的素数模数要困难得多,并且椭圆曲线的通常实现与特定曲线或一小组曲线相关联(因为这样写更容易,更有效)。

关于攻击者如何投入大量工作来“破坏”以特定素为模的离散对数,然后重用中间计算来快速破坏许多以该特定素为模的 DH 实例,存在一些理论上的担忧从这个意义上说,重用常见的 DH 参数可能意味着对攻击者的额外滋扰。但是这种成本分担并不适用于所有的 DL 破坏算法,并且这也假设攻击者可以以素数为模破坏 DL,即素数太短或“特殊形式”。这将是不使用该素数的一个更紧迫的理由:不是它是shared,而是它是weak

因此,使用现有的共享 DH 参数不是问题,只要您可以确保所述参数没有被特别“煮熟”以允许快速(更)休息。这通常意味着生成算法已经被完全指定并且可以被验证是否被忠实地遵循(例如,参见这些)。

使用自定义 DH 参数应该适用于所有客户端,因为将实现绑定到特定模数(与椭圆曲线相反)没有实现优势。只要您的模数符合特定实现的大小要求,事情就应该没问题(一些较旧的实现在大小超过 1024 位时会遇到问题;其他不喜欢大小不是 32 或 64 位倍数的模数)。

1024 位素数在计算范围内,容易受到州级参与者的预计算攻击。

https://weakdh.org/描述了这个问题的评论以及关于这个问题的评论中提到的 logjam 降级攻击。