开发者工具 · SHA 哈希计算器
证书和 SSH 指纹:SHA-256 如何识别公钥
· 背景
sha-256 密码学 安全
指纹是证书或密钥的哈希值,足够短以便可以大声朗读。这篇文章解释了 TLS 和 SSH 指纹的计算方式、为什么 SHA-1 指纹被替换,以及匹配证明了什么。
您始终接受的主机密钥提示 — SHA256: 行要求您进行比较
当您第一次通过 SSH 连接到服务器时,您会看到一条提示,询问是否接受主机密钥。提示显示指纹:`SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8` 或类似的。该指纹是服务器公钥的哈希值。系统会要求您在带外(SSH 协议之外)验证您是否识别此密钥。该提示通常还会显示密钥类型(RSA、ED25519、ECDSA)和指纹格式。如果您之前通过可信渠道看到过该密钥的指纹,则可以放心地键入“yes”。如果不是,接受意味着相信网络会传递正确的密钥。
指纹只是应用于编码密钥的加密哈希函数的输出。对于 SSH,密钥被编码为二进制 blob(OpenSSH 有线格式),并根据该 blob 计算哈希值。指纹比全键短,因此可读且可输入。相同的指纹始终来自相同的密钥,因此您可以比较在多个位置或渠道发布的指纹。
指纹等于编码的哈希值 — DER 证书或公钥 blob 作为输入
SSH 主机密钥和 TLS 证书的编码方式不同,但指纹识别原理相同。对于 SSH,指纹是根据公钥材料计算的。对于 TLS 证书,指纹是根据整个证书(包括颁发者、有效期和其他字段)计算得出的。当您连接到 Web 服务器时,浏览器不会向您显示证书指纹,因为 TLS 使用不同的信任模型:浏览器信任一组预先安装的证书颁发机构 (CA),并且这些 CA 为证书提供担保。 SSH 不使用预安装的 CA;相反,您信任特定密钥并将它们本地存储在 `~/.ssh/known_hosts` 中。
由于指纹包含 TLS 的整个证书字节,因此更改有效日期而不重新签名会导致不同的指纹。对于SSH来说,指纹只是公钥的指纹,所以只要密钥不改变,指纹就是稳定的。
该计算器演示 SHA-1 和 SHA-256 长度;指纹策略建议需要协议源
历史上,SSH 指纹以 MD5 十六进制显示。 MD5 的密码学已被破解,并且碰撞是可行的。安全社区已将 SHA-256 指纹作为默认设置。您可能仍会看到 SSH 客户端显示的两种格式:`SHA256: base64` 和 `MD5: hex`。 SHA-256 指纹是值得信赖的身份验证指纹。如果您看到两者,请将 SHA-256 版本与来自受信任来源(服务器的网站、管理员签名的电子邮件、内部 wiki)的指纹进行比较。 MD5 指纹不太可靠,因为存在 MD5 冲突。
指纹格式的变化是密码转换的明显标志。较旧的 OpenSSH 版本仅显示 MD5。现代版本默认显示 SHA-256 。命令 `ssh-keygen -l -f /path/to/key` 以您的 ssh-keygen 版本的默认格式显示密钥的指纹;您可以使用 `-E` 标志强制使用特定格式(例如 `-E sha256` 或 `-E md5`)。
SSH 的 base64 SHA256:格式 — 使指纹比十六进制短的编码更改
SSH base64 指纹使用变体格式:它们以算法名称和冒号为前缀,例如 `SHA256:base64string`。这与子资源完整性 (SRI) 格式不同,后者使用连字符并且仅包含标准的 base64。 SSH 格式包含一个标签,可以明确是哪个算法生成摘要。当您在 SSH 输出中看到指纹时,始终会显示算法。当您看到 SRI 完整性属性时,算法会被编码为带有连字符的前缀。
ToolAcre SHA 哈希计算器的 base64 输出是标准形式;要匹配 SSH 指纹,请添加 `SHA256: ` (算法名称、冒号和空格)。计算器中的十六进制形式不是 SSH 显示的形式,尽管它代表相同的摘要并且对于验证目的同样有效。
匹配证明了什么 - 您持有另一方发布的相同密钥字节,并且在没有带外检查的情况下没有关于密钥所有者的任何信息
指纹匹配证明了两件事:首先,您持有另一方发布的相同密钥字节,其次,自计算摘要以来,密钥和指纹都没有被更改。它不证明密钥所有者的身份或授权任何特定操作。带外验证指纹是信任密钥的必要条件,但不是充分条件。您还必须验证发布指纹的人是否是他们声称的人。
实际上,如果管理员在公司 Intranet 或签名电子邮件中发布服务器的 SSH 指纹,您可以验证它是否与连接时收到的提示匹配。如果指纹不匹配,您可以放心地拒绝连接,因为有人正在拦截您的流量或服务器密钥已更改。如果指纹匹配,您就知道您拥有正确的钥匙。该密钥是否属于正确的服务器是一个单独的问题,您可以通过验证发布渠道来回答这个问题(Intranet 页面看起来合法吗?电子邮件实际上来自该管理员帐户吗?)。
工作示例 — 逐步验证通过可信渠道发布的指纹
证书指纹具有相同的目的:它唯一地标识特定的证书。如果 TLS 服务器更改其证书(例如,在续订期间),则新证书具有不同的指纹。证书固定(在应用程序中对指纹或一小组可接受的指纹进行硬编码)是一种检测证书更改的安全技术。如果服务器提供具有不同指纹的证书,应用程序将拒绝它。这可以防止受损的 CA 颁发浏览器本来信任的欺诈性证书。
证书固定需要仔细管理:如果服务器更新其证书而您没有预料到,您的应用程序将拒绝有效的新证书。许多应用程序使用公钥固定,即固定公钥而不是整个证书。只要使用相同的密钥,这就允许证书续订而不会被拒绝。
工作示例:使用协议感知工具进行验证,因为 ToolAcre 哈希粘贴了 UTF-8 文本,而不是 DER 或 SSH 线路字节
手动计算指纹进行验证非常简单。将证书或密钥保存到文件中,使用 `openssl dgst -sha256 filename` 或 `ssh-keygen -l -f filename -E sha256` 显示指纹,并与服务器向您显示的指纹进行比较。如果您粘贴密钥字节,ToolAcre SHA 哈希计算器还可以计算摘要,但请记住,计算器会哈希您粘贴的 UTF-8 文本,而不是二进制文件。如果密钥采用 PEM 格式(带有 `-----BEGIN CERTIFICATE-----` 标头和 base64 编码字节的文本),您可以将其粘贴到计算器中。如果是DER格式(二进制),则需要使用命令行工具或先转换为PEM。
边界很重要:ToolAcre 会对您粘贴到计算器界面中的 UTF-8 文本进行哈希处理。它不会从您的设备读取文件(所有计算都在浏览器、选项卡中进行,没有网络)。如果磁盘上有密钥文件,则可以在文本编辑器中打开它,复制文本并粘贴到计算器(如果它是 PEM 格式)。或者您可以使用 `openssl`、`ssh-keygen` 或 `sha256sum` 等命令行工具在本地计算哈希值。
要点:比较带外指纹 - ToolAcre SHA 哈希计算器显示 SHA-1 和 SHA-256 摘要在指纹使用的长度下的样子
ToolAcre SHA 哈希计算器显示任何文本输入的 SHA-1 和 SHA-256 摘要。如果您粘贴 PEM 格式的证书或 SSH 公钥,计算器将计算这两个摘要。对于 SSH 密钥,计算器将对您粘贴的文本进行哈希处理;如果您粘贴标准的 base64 编码的 SSH 公钥格式,则摘要将与 SSH 指纹不匹配,因为 SSH 在散列之前应用其自己的格式(有线格式)。对于直接匹配,您需要采用 SSH 内部使用的确切格式的密钥,这不是公共显示格式。
对于证书指纹,行为类似:如果您粘贴 PEM 编码的证书文本,计算器会对该文本进行哈希处理。证书的指纹是通过编码的证书字节(DER 格式)计算的,而不是 PEM 文本包装器。字节相同,但文本编码不同。要匹配来自 OpenSSL 或浏览器证书查看器的证书指纹,您需要提供人类无法读取的 DER 字节。该计算器的目的是对您可以粘贴和读取的 UTF-8 文本进行哈希处理,从而使边界清晰:它对文本输入进行哈希处理,而不是对标准二进制或有线协议形式的加密密钥文件进行哈希处理。