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 */
};