53.3. SASL 验证

SASL 验证消息流

出现错误时,服务器可以在任何阶段中止身份验证,并发送 ErrorMessage。

53 .3.1. SCRAM-SHA-256 身份验证

目前已实现的 SASL 机制为SCRAM-SHA-256及其带有通道绑定SCRAM-SHA-256-PLUS的变体。在 RFC 7677 和 RFC 5802 中对它们进行了详细描述。

在 PostgreSQL 中使用 SCRAM-SHA-256 时,服务器将忽略 Client 端在client-first-message中发送的用户名。而是使用已经在启动消息中发送的用户名。 PostgreSQL 支持多种字符编码,而 SCRAM 规定将 UTF-8 用作用户名,因此可能无法用 UTF-8 表示 PostgreSQL 用户名。

SCRAM 规范规定该密码也是 UTF-8,并且使用* SASLprep *算法进行处理。但是,PostgreSQL 不需要使用 UTF-8 作为密码。设置用户密码后,无论使用哪种实际编码,都将使用 SASLprep 对其进行处理,就像使用 UTF-8 一样。但是,如果它不是合法的 UTF-8 字节序列,或者包含 SASLprep 算法禁止的 UTF-8 字节序列,则将使用原始密码而不进行 SASLprep 处理,而不会引发错误。这样可以使密码在 UTF-8 中时被规范化,但是仍然允许使用非 UTF-8 密码,并且不需要系统知道密码的 encodings。

带有 SSL 支持的 PostgreSQL 版本支持通道绑定。具有通道绑定的 SCRAM 的 SASL 机制名称为SCRAM-SHA-256-PLUS。 PostgreSQL 使用的通道绑定类型是tls-server-end-point

在没有通道绑定的 SCRAM 中,服务器选择一个随机数,该随机数将被发送到 Client 端,并与发送的密码哈希中的用户提供的密码混合。虽然这可以防止密码哈希在以后的会话中成功重传,但不能防止真实服务器和 Client 端之间的伪造服务器通过服务器的随机值并成功进行身份验证。

带有通道绑定的 SCRAM 通过将服务器证书的签名混合到传输的密码哈希中来防止这种中间人攻击。虽然伪造的服务器可以重新传输真实服务器的证书,但它无权访问与该证书匹配的私钥,因此无法证明它是所有者,从而导致 SSL 连接失败。

Example

上一章 首页 下一章