DES 认证协议
本节说明 DES 认证协议。
DES 认证具有以下格式的 eXternal 数据表示 (XDR) 枚举:
enum authdes_namekind {
ADN_FULLNAME = 0,
ADN_NICKNAME = 1
};
typedef opaque des_block[8];
const MAXNETNAMELEN = 255;
凭证是客户机的完整网络名或其昵称。 对于服务器的第一个事务,客户机必须使用其全名。 对于后续事务,客户机可以使用其昵称。 DES 认证协议包含加密 DES 数据的 64 位块,并指定网络用户名的最大长度。
authdes_cred union 提供全名和昵称格式之间的切换,如下所示:
union authdes_cred switch (authdes_namekind adc_namekind) {
case ADN_FULLNAME:
authdes_fullname adc_fullname;
case ADN_NICKNAME:
unsigned int adc_nickname;
};
全名包含客户机的网络名,加密的对话密钥和窗口。 窗口实际上是凭证的生存期。 如果验证器时间戳记所指示的时间加上窗口已到期,那么服务器可以终止客户机的时间戳记,而不授予请求。 在第一个事务中,服务器确认窗口验证器比窗口小一秒。 要确保仅授予请求一次,服务器可以要求后续请求中的时间戳记大于客户机的先前时间戳记。
使用客户机的完整网络名的凭证的结构如下所示:
struct authdes_fullname {
string name<MAXNETNAMELEN>; /* name of client */
des_block key; /*PK encrypted conversation key*/
unsigned int window; /* encrypted window */
};
时间戳记对自 1970 年 1 月 1 午夜以来的时间进行编码。 时间戳记的结构如下:
struct timestamp {
unsigned int seconds; /* seconds */
unsigned int useconds; /* and microseconds */
客户机验证器具有以下结构:
struct {
adv_timestamp; /* one DES block */
adc_fullname.window; /* one half DES block */
adv_winverf; /* one half DES block */
}
仅在第一个事务中使用窗口验证器。 这些项与 fullname 凭证一起打包到先前显示的结构中,然后再加密。
此结构使用具有输入向量 0 的 CBC 方式加密进行加密。 所有其他时间戳记加密都使用 ECB 方式加密。 客户机的验证器具有以下结构:
struct authdes_verf_clnt {
timestamp adv_timestamp; /* encrypted timestamp */
unsigned int adv_winverf; /* encrypted window verifier */
};
服务器在加密响应验证器中返回客户机的时间戳记 (减 1 秒)。 此验证器还会向客户机发送要在未来事务中使用的未加密昵称。 来自服务器的验证器具有以下结构:
struct authdes_verf_svr {
timestamp adv_timeverf; /* encrypted verifier */
unsigned int adv_nickname; /* new nickname for client */
};