login服務(wù)為L(zhǎng),client為C
(1)L產(chǎn)生隨機(jī)數(shù)challenge,并發(fā)送給C,主要用于最后驗(yàn)證密鑰secret是否交換成功。
(2)C產(chǎn)生隨機(jī)數(shù)clientkey,clientkey是保密的,只有C知道,并通過dhexchange算法換算clientkey,得到ckey。 把base64編碼的ckey發(fā)送給L。
(3)L也產(chǎn)生隨機(jī)數(shù)serverkey,serverkey是保密的,只有L知道,并通過dhexchange算法換算serverkey,得到skey。把base64編碼的skey發(fā)送給C。
(4)C使用clientkey與skey,通過dhsecret算法得到最終安全密鑰secret。
(5)L使用serverKey與ckey, 通過dhsecret算法得到最終安全密鑰secret。C 和 L最終得到的secret是一樣的,而傳輸過程只有ckey skey是通過網(wǎng)絡(luò)公開的,即使ckey skey泄露了,也無法推算出secret。
(6)密鑰交換完成后,需要驗(yàn)證一下雙方的密鑰是否是一致的。C使用密鑰secret通過hmac64哈希算法加密第1步中接收到的challenge,得到CHmac,然后轉(zhuǎn)碼成base64 CHmac發(fā)送給L。
(7)L收到CHmac后,自己也使用密鑰secret通過hmac64哈希算法加密第1步中發(fā)送出去的challenge,得到SHmac,對(duì)比SHmac與CHmac是否一致,如果一致,則密鑰交換成功。不成功就斷開連接。
(8)C組合base64 user@base64 server:base64 passwd字符串(server為客戶端具體想要登錄的登錄點(diǎn),遠(yuǎn)端服務(wù)器可能有多個(gè)實(shí)際登錄點(diǎn)),使用secret通過DES加密,得到etoken,發(fā)送base64 etoken。
(9)使用secret通過DES解密etoken,得到user@server:passwd,校驗(yàn)user與passwd是否正確,通知實(shí)際登錄點(diǎn)server,傳遞user與secret給server,server生成subid返回。
(10)C得到subid后就可以斷開login服務(wù)的連接,然后去連接實(shí)際登錄點(diǎn)server了。(實(shí)際登錄點(diǎn)server,可以由L通知C,也可以C指定想要登錄哪個(gè)點(diǎn))
Q:DH算法是如何防止截包重放的?
A:網(wǎng)絡(luò)截包的方式只能獲取到skey和ckey,但是每次連接L的serverkey是重新隨機(jī)獲取的,也就是skey已經(jīng)發(fā)生了變化,所以在服務(wù)端看來,得到了一個(gè)老的ckey和新的key是無法完成后續(xù)密鑰交換驗(yàn)證的。