对称密码在设计时就存在一个天然的缺陷,就是要求通信双方都要持有相同的密钥。确保密钥的安全传输和防止密钥泄露,往往比加密算法本身更为复杂和困难。一旦密钥被第三方获取,通信的安全性就会受到严重威胁,从而可能暴露敏感信息。接下来跟随博主一起来探索下如何在不安全的网络传输通道中实现密钥共享。
1. 什么是密钥配送问题
密钥配送问题是指在对称密码算法中,加密和解密使用同一个密钥,发送方必须设法将密钥安全地发送给接收方,而不会被第三方窃听者截获。如果密钥被窃取,那么加密的数据也会被破解,因此密钥的安全配送成为对称密码算法的一个关键问题。
为了解决这个问题,密码学领域发展出了多种策略和解决方案。下面分别介绍几种主要的方法:
- 通过通信双方事先共享密钥密钥来解决
- 通过密钥分配中心(KDC)来解决
- 通过密钥交换Diffie-Hellman(DH)来解决
- 通过公钥密码来解决
为了让以下讲解更容易被大家理解,我们假设有如下场景:Alice在网上认识了Bob,现在Alice想给Bob发一封邮件,Alice不想让别人知道邮件的内容,所以她采用了对称密码算法。
接下来Alice就需要想办法让对称密码(此处也可称为密钥或加密密钥) 通过安全的方式提供给Bob。
2. 如何解决密钥配送问题?
2.1. 通过通信双方事先共享密钥来解决
事先共享是指事先用安全的方式将密钥交给对方。这种方法最为简单,但却存在以下局限:
- 地理位置限制:如果Alice和Bob家距离较近,Alice找到Bob,直接告诉他密钥就可以了。如果他们相距较远,就很难事先共享密钥了。
- 记录和管理困难:即使能够实现事先共享密钥,但在人数较多的场景下,通信所需要的密钥数量也会增大,记录和管理如此多的密钥将变更非常困难。比如果Alice除了和Bob发加密邮件,还和另外1000个网友发加密邮件,那么Alice就需要记忆和管理1000个密钥,对于Alice来说,这几乎不可能。
2.2. 通过密钥分配中心(KDC)来解决
若所有参与通信的双方都要事先共享密钥,从而导致密钥的数量巨大,可以使用密钥分配中心(Key Distribution Center,KDC)来解决密钥配送问题。密钥分配中心会给每个人生成一个通信密钥,每个人只要和KDC事先共享密钥就可以了。
注:实质上是把数量巨大的密钥交给KDC记录和管理了,每个人只需要记录自己与KDC的事先共享密钥。
有了KDC后,Alice向Bob发送加密邮件时,具体的步骤如下:
- Alice向KDC发出希望与Bob进行通信的请求。
- KDC生成一个会话密钥S,用于Alice和Bob在本次通信中用于加解密邮件;
- KDC从数据库中取出Alice的密钥A和Bob的密钥B;
- KDC用Alice的密钥(KDC与Alice的事先共享密钥A)对会话密钥S进行加密,并发送给Alice;
- KDC用Bob的密钥(KDC与Bob的事先共享密钥B)对会话密钥S进行加密,并发送给Bob;
- Alice对来自KDC的会话密钥(己使用Alice的密钥A加密)进行解密,得到会话密钥S。
- Alice用会话密钥S对邮件进行加密,并将邮件发送给Bob;
- Bob对来自KDC的会话密钥(己使用Bob的密钥B加密)进行解密,得到会话密钥S。
- Bob用会话密钥S对来自Alice的加密邮件进行解密。
- Alice和Bob删除会话密钥S。
上图为在KDC的参与下,Alice与Bob的加密通信过程。虽然KDC有效,但也存在局限:
- 所有的加密通信都由KDC处理,随着通信参与方增多,KDC的负荷也随之增加,可能出现单点故障导致整个加密通信平台瘫痪;
- 如果 KDC被攻破,所有的通信都会被攻击者破译。
2.3. 通过密钥交换Diffie-Hellman(DH)来解决
Diffie-Hellman密钥交换是1976年由Whitfield Diffie和Martin Hellman共同发明的一种算法。通过此算法,通信双方仅通过交换一些可公开的信息就能够生成出共享密钥了。
虽然这种算法被称为密钥交换,但双方并没有真正的交换过密钥,而是通过计算生成了一个相同的共享密钥。因此,这种算法也被称为Diffie-Hellman密钥协商。
由于Diffie-Hellman密钥协商原理比较复杂,一两句话说不清楚,在本文就不展开介绍了,如果大家感兴趣可以参阅博主文章《一文读懂密钥交换(DH、ECDH)算法(附密码国标下载)》。
2.4. 通过公钥密码来解决
在公钥密码中加密密钥(公钥)和解密密钥(私钥)是不同的。加密密钥是可以公开的,任何知道加密密钥的人都可以进行加密,但只有拥有解密密钥的人才能解密。
为了解决Alice与Bob的加密通信问题,Bob可以将加密密钥(公钥)发送给Alice,即便此加密密钥被他人窃取也关系不大,因为只有Bob才有解密密钥(私钥)。这样一来,其实就不存在密钥配送问题了。即采用公钥密码替代对称密钥可以解决密钥配送问题。
当然还有一种比较好的实践方法(HTTPS通信中常用的方式),即将对称密码的共享密钥通过公钥密码(用对方的公钥加密共享密钥)来配送,由于步骤与公钥密码类似(仅把公钥密码中通信的消息换成了共享密钥),具体工作流程如下图。
需要注意的是,如果采用了公钥密码来进行密钥配送,就又会涉及到数字证书和数字签名问题。若想了解更多关于公钥密码、数字签名和数字证书的细节,可以参阅博文:
- 《一文彻底搞懂公钥密码、数字签名和数字证书》