哈希在 TLS/SSL 证书验证中起什么作用?

信息安全 tls 证书
2021-08-22 02:46:53

热门网络问题部分遇到这个问题并阅读了Google 的相关博客文章后,我开始好奇这些哈希函数在 TLS/SSL 证书验证中所起的作用。

我的印象是 SSL 证书只是一组域名和公钥(准确地说是网站所有者的公钥)之间的链接,由证书颁发机构的私钥加密签名。为什么需要哈希函数来验证它?

2个回答

基本上,散列函数是创建数字签名过程的必要部分。

大多数签名算法的设计目的不是能够安全和/或有效地直接签署长消息,因此每个算法的第一步通常是对正在签名的消息进行散列,将其减少到固定长度,签名算法的其余部分是能够有效处理。类似地,签名验证算法涉及对正在验证的消息进行哈希处理,然后对签名执行一些操作以检查它是否对应于该哈希。

例如,使用 RSA 签名,可以将签名视为正在签名的数据的哈希,使用签名者的私钥“加密”:

说明如何应用和验证简单 RSA 数字签名的图表。 图片来自维基共享资源

验证过程涉及“解密”签名(使用签名者的公钥),并将生成的散列与签名适用的数据的散列进行比较。对于 SSL 证书,数据就是 SSL 证书本身。

注意:我在这里用引号写了“加密”和“解密”,因为实际上 RSA 签名算法中使用的操作与用于 RSA 加密的操作并不完全相同。尽管它们足够接近,但可以在这里进行有效的类比。与 ECDSA 等其他签名算法相比,签名和验证算法完全不同,不涉及“加密”或真正类似于上述过程的任何内容,但消息仍然作为签名和验证过程的一部分进行哈希处理。

有关在特定签名算法中使用散列的更多详细信息,请参阅:

此答案来自阅读dave_thompson_085评论中链接的问题

通常,数字签名实际上并未应用于完整数据。相反,数据(在 x.509 证书的情况下)被散列,并且只有生成的散列被签名。

如果不是这种情况,数字签名最终将至少与消息本身一样大,并且签名/验证文件的效率会降低。

然而,这意味着,如果攻击者可以使用自己的公钥/私钥对生成与合法证书具有相同哈希值的伪造证书,则伪造证书可以通过验证检查,并可用于执行人为干预。中间攻击。