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


这就涉及到 DH 算法(即 Diffie-Hellman 密钥交换算法),关于DH算法的资料,有兴趣可以详读《Diffie-Hellman密钥协商算法》,限于篇幅,这里不专门讨论 。
Diffie-Hellman 密钥交换算法的安全性依赖于这样一个事实:虽然计算以一个素数为模的指数相对容易,但计算离散对数却很困难 。对于大的素数,计算出离散对数几乎是不可能的 。
这里简要描述一下 DH 共享密钥的过程如下:

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

文章插图
(其中“密钥 S”即为最终的共享密钥)
4.3 采用共享密钥的原因
端到端加密采用共享密钥的方式来传输会话密钥有如下几个原因:
1)如果采用 RSA、ECC 等公钥加密私钥解密的方式传输密钥,需要在创建会话时生成临时密钥,并通过对方公钥加密后传输到接收端 。
这就需要完全保证消息的可靠性,如果该消息在任何一个环节中丢失或损坏,则后续通信都无法进行 。或者,需要采用更为可靠的传输方案,通常做法为需要接收端在线,通过各种确认来保证这个可靠性 。
而采用共享密钥的方式则只需要知道对方的公钥,就可以完成生成共享密钥,并不一定需要对方在线 。
2)如果已经生成的临时对称密钥丢失,则需要重新协商密钥 。而采用共享密钥的方式则只需要知道对方的公钥,就可以完成生成共享密钥,不需要重新协商 。
3)采用公钥加密私钥解密的方式至少会比生成共享密钥方式多一次交换对称密钥的通信过程 。
4)密钥协商方式,不仅仅可以完成两个点之间的密钥协商,还可以延展到多人之间的共同协商出相同的密钥,这样能满足多人群体沟通的需求 。
 
5、端到端加密的初步实践方案 
我们结合对于 DH 算法(即 Diffie-Hellman 密钥交换算法)这种共享密钥方式的认知(即公钥可随意公开),先设计一个简单的端到端消息加密的过程 。
这个过程的逻辑流程如下:
 
  • 1)在客户端 APP 首次安装时,基于服务器公开的两个全局的参数,生成自己的 DH 公钥和私钥;
  • 2)将自己的公钥上传证书服务器,证书服务器上保存用户标识与其公钥的关系 。私钥则保存在客户端上;
  • 3)首次给对方发送消息或首次接收到对方消息时,便到证书服务器查询对方的公钥;
  • 4)根据对方公钥和自己的私钥计算出共享密钥;
  • 5)后续与对方所有的消息都基于这个密钥和相同的对称加解密算法进行加密解密操作 。
 
端到端消息加密过程示意:
IM聊天系统安全手段之传输内容端到端加密技术

文章插图
至此:我们完成了一个简单的端到端消息加密方案,在这个方案中我们引入了一个第三方的用于存储用户公钥的角色,这个角色的存在可以让任何一方都不用关心对方的在线状态,随时给对方发送加密过消息,而消息转发服务器无法解密消息 。
【IM聊天系统安全手段之传输内容端到端加密技术】接下来,我们针对这个简单方案存在的各种安全隐患问题,进行逐步分析和优化 。
 
6、端到端加密实践方案的进一步优化和演进 
6.1 使用Hmac作为消息完整性认证算法
在消息传输过程中,双方需要确认彼此消息的完整性,简单的做法就是将消息进行 Hash,得到的 Hash 值附加到消息后,随消息一起发送;对端接收后,同样进行 Hash,来验证消息是否被篡改 。
关键点在于不同数据得到的 Hash 值一定不同,其中带密钥的 Hash 值就是 MAC算法 。
另外,为了避免使用同样的 Hash 函数对相同数据进行操作总是得出同样的值,额外加入一个密钥,这样使用不同密钥就可以得出不同的 MAC 。当然,这个密钥是两个对端都知道的 。
这样,我们就得到了基于加密 Hash 的消息完整性认证的算法——Hash-based MAC(简称HMAC) 。
基础知识1:什么是MAC算法?
全称Message Authentication Code,即消息认证码(带密钥的Hash函数) 。在密码学中,MAC是通信实体双方使用的一种验证机制,是保证消息数据完整性的一种工具 。
MAC算法的安全性依赖于Hash函数,故也称带密钥的Hash函数 。消息认证码是基于密钥和消息摘要“hash”所获得的一个值,可用于数据源发认证和完整性校验 。


推荐阅读