1.8 ECDH密钥协商
在TLS协议握手阶段,为了可以不传输密钥就完成共享密钥的协商,需要一种密钥协商算法。密钥协商算法并不唯一,需要双方协商决定,这里只介绍密钥协商算法中的其中一种,即基于椭圆曲线的迪菲-赫尔曼密钥交换算法,在TLS/SSL协议握手过程中交换的两个随机数random_C和random_S就是为了完成这个算法做准备的,通过这两个随机数和密钥协商算法可以计算得到Pre-Master而最终确定共享密钥。
基于椭圆曲线的迪菲-赫尔曼密钥交换(Elliptic Curve Diffie–Hellman key Exchange,ECDH)算法,主要用来在一个不安全的通道中建立起安全的共有加密资料,一般来说加密资料都是共享密钥,这个密钥作为对称加密的密钥被双方在进行后续数据传输时使用。
ECDH算法是建立在这样一个前提之上的:给定椭圆曲线上的一个点P和一个整数K,求Q=KP很容易,但是通过Q或P求解K很难。
通过一个经典的场景来介绍ECDH算法流程,Alice和Bob要在一条不安全的网络链路上协商共享密钥,并且协商的密钥不能被中间人知晓。
首先,双方约定使用ECDH算法,这个时候双方知道ECDH算法里的一个大素数P,这个大素数P可以看作ECDH算法中的常量。
P的位数决定了攻击者破解的难度。
还有一个整数g用来辅助整个密钥交换,g不用很大,一般是2或5,双方知道g和P之后就开始了交换密钥的过程。
Alice知道了公用参数P和g,生成私有整数a作为私钥,公钥算法一般是公钥加密,私钥解密。公钥给对方来加密数据,对方拿到密文后再用私钥解密查看内容的正确性。这个时候如果Alice直接通过网络链路告诉Bob自己的私钥a,这显然既不合理,也是一件风险很大的事,所以要避免直接通过网络链路传输私钥a。
这个时候,Alice需要利用P和g作为辅助生成自己的公钥A,公钥A的生成公式为ga mod P=A,生成的公钥A可以通过网络链路传输。
Bob通过网络链路收到Alice发来的P、g和公钥A,知道了Alice的公钥A。这个时候,Bob生成自己的私钥b,同样通过公式gb mod P=B生成自己的公钥B。
在Bob发送自己的公钥B前,Bob通过公式Ab mod P=K生成K作为共享密钥,但是并不发送给Alice,只通过网络链路发送自己的公钥B。
Alice收到Bob发来的公钥B以后,同样通过Ba mod P=K生成共享密钥K,这样Alice和Bob就通过不传递各自私钥a和b的方式完成了对共享密钥K的协商。
可以通过代入具体数字的一个例子来重复一下上面的过程。
(1)Alice和Bob同意使用大素数P和整数g。
P=83,g=8
(2)Alice选择密钥a=9, 生成公钥 ga mod P=A并发送。
89mod83=5
(3)Bob选择密钥 b=21, 生成公钥Ab mod P=B并发送。
821mod83=18
(4)Alice计算 Ba mod P=K。
189mod83=24
(5)Bob计算Ba mod P=K。
521mod83=24
至此24就是双方协商出来的共享密钥,可以看到在整个过程中共享密钥24都没有通过网络链路传输,保证了密钥的安全性,在后续通信过程中Alice和Bob可以使用24作为Pre-Master继续计算对称加密的密钥。
1)协议所面临的问题
由于ECDH协议不会验证公钥发送者的身份,因此无法阻止中间人攻击。如果监听者Mallory截获了Alice的公钥,就可以替换为自己的公钥,并将其发送给Bob。Mallory还可以截获Bob的公钥,替换为自己的公钥,并将其发送给Alice。这样,Mallory就可以轻松地对Alice与Bob之间发送的任何消息进行解密。Mallory可以更改消息,用自己的密钥对消息重新加密,然后将消息发送给接收者。
为了解决此问题,Alice和Bob可以在交换公钥之前使用数字签名对公钥进行签名,有两种方法可以实现此目的。
• 用安全的媒体(如语音通信或可信载运商)在双方之间传输数字签名密钥。
• 使用第三方证书颁发机构向双方提供可信数字签名密钥。
2)区块链中的应用场景
在联盟链中,当多个参与者共享同一条网络链路时,若各参与者想要在同一条网络链路上实现通信间的隔离,则可以使用ECDH算法将链路进行逻辑上的拆分,使得同一链路上的消息采用不同的密钥进行加密,来达到物理链路隔离的目的。通过这样的方式既可以实现通信连接的复用,避免频繁建立大量通信连接,又可以保证同一链路不同参与者的通信隔离。
各参与者的身份在加入区块链网络前已经由MSP(Membership Service Provider)颁发过证书,并且进行过准入验证,这样就可以规避ECDH协议的缺陷。