DHexchange密钥交换算法

login服务为L,client为C

(1)L产生随机数challenge,并发送给C,主要用于最后验证密钥secret是否交换成功。

(2)C产生随机数clientkey,clientkey是保密的,只有C知道,并通过dhexchange算法换算clientkey,得到ckey。 把base64编码的ckey发送给L。

(3)L也产生随机数serverkey,serverkey是保密的,只有L知道,并通过dhexchange算法换算serverkey,得到skey。把base64编码的skey发送给C。

(4)C使用clientkey与skey,通过dhsecret算法得到最终安全密钥secret。

(5)L使用serverKey与ckey, 通过dhsecret算法得到最终安全密钥secret。C 和 L最终得到的secret是一样的,而传输过程只有ckey skey是通过网络公开的,即使ckey skey泄露了,也无法推算出secret。

(6)密钥交换完成后,需要验证一下双方的密钥是否是一致的。C使用密钥secret通过hmac64哈希算法加密第1步中接收到的challenge,得到CHmac,然后转码成base64 CHmac发送给L。

(7)L收到CHmac后,自己也使用密钥secret通过hmac64哈希算法加密第1步中发送出去的challenge,得到SHmac,对比SHmac与CHmac是否一致,如果一致,则密钥交换成功。不成功就断开连接。

(8)C组合base64 user@base64 server:base64 passwd字符串(server为客户端具体想要登录的登录点,远端服务器可能有多个实际登录点),使用secret通过DES加密,得到etoken,发送base64 etoken。

(9)使用secret通过DES解密etoken,得到user@server:passwd,校验user与passwd是否正确,通知实际登录点server,传递user与secret给server,server生成subid返回。

(10)C得到subid后就可以断开login服务的连接,然后去连接实际登录点server了。(实际登录点server,可以由L通知C,也可以C指定想要登录哪个点)

Q:DH算法是如何防止截包重放的?

A:网络截包的方式只能获取到skey和ckey,但是每次连接L的serverkey是重新随机获取的,也就是skey已经发生了变化,所以在服务端看来,得到了一个老的ckey和新的key是无法完成后续密钥交换验证的。

你可能感兴趣的:(DHexchange密钥交换算法)