IM聊天系统安全手段之传输内容端到端加密技术( 三 )


使用 MAC 验证消息完整性的具体过程是:
 

  • 1)假设通信双方 A 和 B 共享密钥 K,A用消息认证码算法将 K 和消息 M 计算出消息验证码 Mac,然后将 Mac 和 M 一起发送给 B;
  • 2)B 接收到 Mac 和 M 后,利用 M 和 K 计算出新的验证码 Mac*,若 Mac*和Mac 相等则验证成功,证明消息未被篡改 。
 
由于攻击者没有密钥 K,攻击者修改了消息内容后无法计算出相应的消息验证码,因此 B 就能够发现消息完整性遭到破坏 。
简而言之就是:
 
  • 1)发送者通过MAC算法计算出消息的MAC值,并和消息一起发给收信者;
  • 2)收信者用同样的MAC算法计算收到的消息的MAC值,并对比两者 。
 
下图是原理示意:
IM聊天系统安全手段之传输内容端到端加密技术

文章插图
基础知识2:什么是HMAC算法?
HMAC是MAC算法中的一种,其基于加密HASH算法实现 。任何加密HASH, 比如MD5、SHA256等,都可以用来实现HMAC算法,其相应的算法称为HMAC-MD5、HMAC-SHA256等 。
6.2 使用ECDH算法替换DH算法
DH 算法是以离散对数的数学难题为基础的,随着计算机计算能力逐步增强,我们要不停地使用更大的数以增加破解难度,目前业界普遍认为至少需要使用 2048 位 DH 算法才具备更好的安全性 。
在此我们引入 ECDH 算法替换 DH 算法 。ECDH 密钥协商算法是 ECC 算法和 DH 密钥交换原理结合使用 。ECC 是建立在基于椭圆曲线的离散对数问题上的密码体制 。在相同破解难度下,ECC 具有更小长度的密钥和更快的正向计算速度优势 。
我们系统上的 ECDH 可以直接采用目前公开的 sepc256kl 和 Curve25519 曲线,而无需服务再提供公开大数参数 。
6.3 提升前向安全性
在消息传输过程中,如果协商好的密钥泄露了,就意味着所有信息都将暴露于风险之下 。
为了防止这种情况发生,我们需要每次加密使用的密钥都与上一次不同,且不可以反向推导得出之前的密钥 。
此处引入一个 Hash 算法:这个 Hash 算法可以通过输入一个密钥导出另外一个离散性更大的密钥,每次发送消息时都是用上次的消息密钥进行 Hash 运算得出本次密钥,由于 Hash 算法具有单向不可逆的特性,因此就无法通过本次的密钥推导之前的密钥 。
从感观上,这就像一个棘轮,棘轮就是一种特殊的齿轮,他只能往一个方向转下去,而不能往回转 。
我们先来感性认识一下棘轮:
IM聊天系统安全手段之传输内容端到端加密技术

文章插图
在技术上,做到"只能往一个方向转下去,而不能往回转",是达到前向安全的关键 。这就保证了,如果某一轮的密钥被破解出来,但前面的密钥是无法计算出来的,也就是前面的消息无法被解密 。
6.4 同时保证前向安全和后向安全性
出于极致的安全性要求,我们会同时考虑前向安全和后向安全 。如何保证在某次通信中,被破解出来的密钥,不能破解出之前的消息,而且在一定周期内,这个破解出来的密钥将不会再起作用 。
介于此我们再引入另外一个棘轮来保证其向后的安全性 。这就是大名鼎鼎的 Signal protocol 中的双棘轮算法 。
Signal protocol 是真正的端到端的通讯加密协议,号称是世界上最安全的通讯协议,任何第三方包括服务器都无法查看通讯内容 。
双棘轮算法包含一个 KDF 棘轮和一个 DH 棘轮 。
 
KDF 全称(Key derivation function) 密钥导出函数,用于从一个原始的密钥导出一个或多个密钥 。本质上就是 Hash 函数,通常用来将短密码变成长密码 。另外 KDF 需要加“盐”(salt),用于防彩虹表,出于 Hash 的特性,这个“盐”的长度至少要大于 Hash 结果长度 。
KDF (原密钥,盐) = 导出密钥
 
KDF 棘轮就是运用 KDF 算法,设计出一种密钥不断变化的效果,流程如下:
IM聊天系统安全手段之传输内容端到端加密技术

文章插图
首先:将初始密钥使用 KDF 算法导出新的密钥,新密钥被切成两部分,前半部分作为下一次 KDF 计算的输入,后半部分作为消息密钥 。


推荐阅读