8. Password Authentication Method: "password" (密码认证方法: "password")
密码认证使用以下数据包。请注意, 服务器可以请求密码更改。所有实现应该支持密码认证。
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "password"
boolean FALSE
string plaintext password in ISO-10646 UTF-8 encoding [RFC3629]
请注意, 'plaintext password' 值以 ISO-10646 UTF-8 编码。服务器如何解释密码并根据密码数据库验证它取决于服务器。但是, 如果客户端以其他编码 (例如, ISO 8859-1 - ISO Latin1) 读取密码, 它必须在传输前将密码转换为 ISO-10646 UTF-8, 服务器必须将密码转换为该系统上用于密码的编码。
从国际化的角度来看, 希望如果用户输入其密码, 无论用户使用什么操作系统和客户端软件, 认证过程都能正常工作。在传输之前对密码进行字符集转换将有助于此过程。但是, 用户应该意识到, 在不同系统上输入密码可能很困难 (例如, 不同语言环境的键盘布局可能使输入密码变得困难)。
请注意, 即使明文密码在数据包中传输, 整个数据包也由传输层加密。服务器和客户端都应该检查底层传输层是否提供机密性 (即, 是否正在使用加密)。如果未提供机密性 ("none" 密码), 应该禁用密码认证。如果有机密性, 此方法简单并适用于基于密码的用户认证系统。
通常, 服务器使用成功或失败响应此消息。但是, 如果密码已过期, 服务器应该通过响应 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 来指示这一点。在任何情况下, 服务器绝对不能允许使用过期密码进行认证。
byte SSH_MSG_USERAUTH_PASSWD_CHANGEREQ
string prompt in ISO-10646 UTF-8 encoding [RFC3629]
string language tag [RFC3066]
在这种情况下, 客户端可以继续使用不同的认证方法, 或从用户请求新密码并使用以下消息重试密码认证。客户端也可以发送此消息而不是正常的密码认证请求, 而无需服务器请求。
byte SSH_MSG_USERAUTH_REQUEST
string user name
string service name
string "password"
boolean TRUE
string plaintext old password in ISO-10646 UTF-8 encoding [RFC3629]
string plaintext new password in ISO-10646 UTF-8 encoding [RFC3629]
服务器必须使用 SSH_MSG_USERAUTH_SUCCESS, SSH_MSG_USERAUTH_FAILURE 或另一个 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 回复每个请求消息。这些的含义如下:
-
SSH_MSG_USERAUTH_SUCCESS - 密码已更改, 认证已成功完成。
-
SSH_MSG_USERAUTH_FAILURE with partial success - 密码已更改, 但需要更多认证。
-
SSH_MSG_USERAUTH_FAILURE without partial success - 密码未更改。要么不支持密码更改, 要么旧密码错误。请注意, 如果服务器已发送 SSH_MSG_USERAUTH_PASSWD_CHANGEREQ, 我们知道它支持更改密码。
-
SSH_MSG_USERAUTH_CHANGEREQ - 密码未更改, 因为新密码不可接受 (例如, 太容易猜到)。
密码认证方法使用以下特定于方法的消息编号。
SSH_MSG_USERAUTH_PASSWD_CHANGEREQ 60