1. 1. 前言   
  2. PAP和CHAP协议是目前的在PPP(MODEM或ADSL拨号)中普遍使用的认证协议,CHAP在RFC1994中定义,是一种挑战响应式协议,双方共享的口令信息不用在通信中传输;PAP在RFC1334中定义,是一种简单的明文用户名/口令认证方式。   
  3.   
  4. 2. PAP   
  5. PAP全称为:Password Authentication Protocol(口令认证协议),是PPP中的基本认证协议。PAP就是普通的口令认证,要求将密钥信息在通信信道中明文传输,因此容易被sniffer监听而泄漏。   
  6.   
  7. PAP协商选项格式:   
  8.     0                   1                   2                   3  
  9.     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  10.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  11.    |     Type      |    Length     |     Authentication-Protocol   |   
  12.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  13.     
  14. 对于PAP,参数为:   
  15. Type = 3,Length = 4,Authentication-Protocol = 0xc023(PAP)   
  16.   
  17. PAP数据包格式:   
  18.     0                   1                   2                   3  
  19.     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  20.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  21.    |     Code      |  Identifier   |            Length             |   
  22.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  23.    |    Data ...   
  24.    +-+-+-+-+   
  25.     
  26.    Code:1字节,表示PAP包的类型   
  27.          1       认证请求   
  28.          2       认证确认   
  29.          3       认证失败   
  30.    Identifier:ID号,1字节,辅助匹配请求和回应   
  31.    Length:2字节,表示整个PAP数据的长度,包括Code, Identifier, Length和   
  32.            Data字段。   
  33.    Data:可能是0字节或多个字节,具体格式由Code字段决定,成功或失败类型包中长   
  34.          度可能为0。   
  35.   
  36. 对于认证请求(Code = 1)类型,PAP包格式为:   
  37.     0                   1                   2                   3  
  38.     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  39.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  40.    |     Code      |  Identifier   |            Length             |   
  41.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  42.    | Peer-ID Length|  Peer-Id ...   
  43.    +-+-+-+-+-+-+-+-+-+-+-+-+   
  44.    | Passwd-Length |  Password  ...   
  45.    +-+-+-+-+-+-+-+-+-+-+-+-+-+   
  46.   
  47.    Code(Code = 1),Identifier和Length字段含义如前面所述,响应包的Identifier字段值和挑战包中的相同,Identifier字段必须每次认证时改变。   
  48.     
  49.    Peer-ID-Length:长度1个字节,表示Peer-ID域的长度   
  50.     
  51.    Peer-ID:可为0到多个字节长,表示认证对方的名称。   
  52.     
  53.    Passwd-Length:长度1个字节,表示Password域的长度   
  54.     
  55.    Password:可为0到多个字节长,表示认证的口令,明文   
  56.   
  57. 对于认证确认(Code = 2)和认证失败(Code = 3)类型,PAP包格式为:   
  58.     
  59.     0                   1                   2                   3  
  60.     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  61.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  62.    |     Code      |  Identifier   |            Length             |   
  63.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  64.    |  Msg-Length   |  Message  ...   
  65.    +-+-+-+-+-+-+-+-+-+-+-+-+-   
  66.     
  67. 其中:   
  68.    Code,Identifier和Length字段含义如前面所述,响应包的Identifier字段值和认证请求包中的相同。   
  69.     
  70.    Msg-Length:长度1个字节,表示Message域的长度   
  71.     
  72.    Message:可为0到多个字节长,具体内容由应用实际实现时确定,RFC中没有限制其   
  73.        内容,推荐使用可读的ASCII字符表示信息内容。   
  74.   
  75. 3. CHAP   
  76.     
  77. CHAP全称为:Challenge Handshake Authentication Protocol(挑战握手认证协议),主要就是针对PPP的,除了在拨号开始时使用外,还可以在连接建立后的任何时刻使用。   
  78.     
  79. CHAP协议基本过程是认证者先发送一个随机挑战信息给对方,接收方根据此挑战信息和共享的密钥信息,使用单向HASH函数计算出响应值,然后发送给认证者,认证者也进行相同的计算,验证自己的计算结果和接收到的结果是否一致,一致则认证通过,否则认证失败。这种认证方法的优点即在于密钥信息不需要在通信信道中发送,而且每次认证所交换的信息都不一样,可以很有效地避免监听***。   
  80.     
  81. CHAP缺点:密钥必须是明文信息进行保存,而且不能防止中间人***。   
  82.     
  83. 使用CHAP的安全性除了本地密钥的安全性外,网络上的安全性在于挑战信息的长度、随机性和单向HASH算法的可靠性。   
  84.     
  85. CHAP选项格式:   
  86.     0                   1                   2                   3  
  87.     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  88.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  89.    |     Type      |    Length     |     Authentication-Protocol   |   
  90.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  91.    |   Algorithm   |   
  92.    +-+-+-+-+-+-+-+-+   
  93.     
  94. 对于CHAP,参数固定为:   
  95. Type = 3,Length = 5,Authentication-Protocol = 0xc223(CHAP),Algorithm = 5 (MD5)   
  96.   
  97. CHAP数据包格式:   
  98.     0                   1                   2                   3  
  99.     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  100.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  101.    |     Code      |  Identifier   |            Length             |   
  102.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  103.    |    Data ...   
  104.    +-+-+-+-+   
  105.     
  106.    Code:1字节,表示CHAP包的类型   
  107.          1       挑战   
  108.          2       响应   
  109.          3       成功   
  110.          4       失败   
  111.     
  112.    Identifier:ID号,1字节,辅助匹配挑战、响应和回答,每次使用CHAP时必须改变   
  113.     
  114.    Length:2字节,表示整个CHAP数据的长度,包括Code, Identifier, Length和   
  115.            Data字段。   
  116.     
  117.    Data:可能是0字节或多个字节,具体格式由Code字段决定,成功或失败类型包中长度   
  118.          可能为0  
  119.     
  120. 对于挑战(Code = 1)和响应(Code = 2)类型,CHAP包格式为   
  121.     0                   1                   2                   3  
  122.     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  123.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  124.    |     Code      |  Identifier   |            Length             |   
  125.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  126.    |  Value-Size   |  Value ...   
  127.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  128.    |  Name ...   
  129.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  130.     
  131. 其中:   
  132.    Code,Identifier和Length字段含义如前面所述,响应包的Identifier字段值和挑战包中的相同。   
  133.     
  134.    Value-Size:此字段1字节表示Value的长度   
  135.     
  136.    Value:至少是一个字节,可变长,按网络序传输,挑战/响应信息在此字段中说明,   
  137.           挑战信息必须是随机的,在每次认证时改变,挑战信息是由应用在实际实现   
  138.           中自己定义的,RFC中并没有规定挑战信息的具体格式;   
  139.     
  140.    响应值按下面的公式进行计算:   
  141.        Response=HASH(Identifier+secret+Challenge)   
  142.     
  143.    其中“+”号表示将各数据在内存中串起来,其中HASH算法可以使用MD5,所以计算出来的HASH值是固定的,16字节长。   
  144.   
  145.   Name:至少一个字节,用来标志所传的这个包,必须是以'\0'或“\r\n”结束,   
  146.         Name字段的长度可根据Length和Value-Size计算出来。   
  147.   
  148. 对于成功(Code = 3)或失败(Code = 4)类型   
  149.     0                   1                   2                   3  
  150.     0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
  151.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  152.    |     Code      |  Identifier   |            Length             |   
  153.    +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+   
  154.    |  Message  ...   
  155.    +-+-+-+-+-+-+-+-+-+-+-+-+-   
  156.     
  157.    Code,Identifier和Length字段含义如前面所述,Identifier字段和挑战/响应信息一致。   
  158.     
  159.    Message可以是0字节,也可以是多个字节,内容可以根据实际应用自己确定。   
  160.     
  161. 4. 结语   
  162.     
  163. PAP和CHAP在目前的PPP应用中都在使用,CHAP相对要复杂一些,但安全性也高一些。在PPP具体实现中通常是同时使用,在Linux下PPP的实现中,如果服务器要求的PAP认证失败,会再次要求用CHAP认证。