但是这种密钥协商算法仍然存在一个问题。当Bob将他的Bob_ECDH_pub_key发送给Alice时,攻击者可以截获Bob_ECDH_pub_key,自己运行ECDH_Generate_Key算法产生一个公钥/私钥对,然后把他产生的公钥发送给Alice。同理,攻击者可以截获Alice发送给Bob的Alice_ECDH_pub_key,再运行ECDH_Generate_Key算法产生一个公钥/私钥对,并把这个公钥发送给Bob。Alice和Bob仍然可以执行协议,产生一个密钥Key。但实际上,Alice产生的密钥Key实际上是和攻击者Eve协商的;Bob产生的密钥Key也是和攻击者协商Eve的。这种攻击方法被称为中间人攻击(Man In The Middle Attack)。
鉴于这个陷阱如此险恶,因此就有人提出将Encrypt和MAC直接集成在一个算法内部,让有经验的密码专家在算法内部解决安全问题,不让算法使用者选择,这就是这就是AEAD(Authenticated-Encryption With Addtional data)类的算法。TLS1.3彻底禁止AEAD以外的其他算法。mmtls经过综合考虑,选择了使用AES-GCM这种AEAD类算法,作为协议的认证加密组件,而且AES-GCM也是TLS1.3要求必须实现的算法。
Client Write MAC Key (用于Client算消息认证码,以及Server验证消息认证码)
Server Write MAC Key (用于Server算消息认证码,以及Client验证消息认证码)
Client Write Encryption Key(用做Client做加密,以及Server解密)
Server Write Encryption Key(用做Server做加密,以及Client解密)
Client Write IV (Client加密时使用的初始化向量)
Server Write IV (Server加密时使用的初始化向量)