云计算时代的安全概述——密钥交换(一)
我们之前介绍的内容主要集中在对称加密上。从本文开始,我们的重点转移到非对称加密算法,也称为公钥加密算法。整个算法有一个非常关键的环节:密钥交换。密钥交换“人”顾名思义,要解决的本质问题就是如何安全地交换密钥。让我们邀请我们的老朋友爱丽丝王后和鲍勃勋爵来解释。假设爱丽丝王后和鲍勃勋爵想要安全地通信,那么爱丽丝王后和鲍勃勋爵将把他们各自的密钥发送给对方。这样一来,通信双方都持有* * *共享的这个密钥,可以用于后续的信息安全交互。
为了让后续的讨论更接地气,我们假设爱丽丝女王和鲍勃勋爵从未谋面,那么如何才能让女王和勋爵安全沟通呢?这个问题也是密钥交换算法最原始的应用场景。为了保证女王和领主之间通信的私密性,双方都需要一个* * *共享的密钥,但是安全通信* * *共享密钥并没有想象中那么简单。如果有恶意攻击者窃听了女王和领主之间的电话通信或电子邮件通信(假设传输的是明文信息),那么恶意攻击者就会窃取女王和领主共享的密钥,双方随后的所有通信内容都可以被这个密钥破解,所以女王和领主之间的所有私人通信都是不安全的,通信内容成了整个王国茶余饭后的谈资。
如何解决这个问题?这是密钥交换算法要解决的核心问题。简单来说,通过密钥交换算法,爱丽丝王后和鲍勃勋爵可以安全地交换密钥。即使恶意攻击者在监听所有通信线路,也无法从双方获得密钥,女王和领主终于可以无忧无虑地八卦了。
秘密密钥交换始于通信双方生成他们自己的秘密密钥。通常,非对称加密算法会生成两个密钥:公钥和私钥。然后通信双方互相发送自己的公钥,公钥的“公开”在这里就是公开的意思,也就是说恶意攻击者也可以获取通信双方生成的公钥信息。然后女王和领主把收到的公钥和自己的私钥结合起来,结果就是* * *共享的通信密钥。您可以从恶意攻击者的角度来看这个公钥。因为恶意攻击者没有任何一方的私钥,所以恶意攻击者无法获取“* * *”密钥用于女王和领主之间的通信。关于* * *在女王和领主这边享受秘钥的过程,如下图所示:
了解了密钥交换算法的一般工作机制之后,我们再来看看密钥交换算法是如何解决爱丽丝王后和鲍勃勋爵之间的安全通信问题的。在上图所示的过程中,女王和领主通过密钥交换算法确定可以用于安全通信的密钥,这个密钥可以作为认证和加密的密钥。因此,即使MITM(中间人攻击者)截获了女王和领主之间的通信数据,由于没有密钥,通信内容也不会被破解,女王和领主可以安全通信,如下图所示:
不过这里描述的内容有点不严谨。充其量,我们只能称这种情景为被动的MITM。在白话文里是指恶意攻击者被动监听,但与主动MITM的主要区别在于,主动中间人会截取密钥交换算法交换的数据,然后同时模拟通信双方的角色。具体来说,中间人会同时主动与女王和领主交换密钥,通信双方“认为”自己与对方达成了一个关于* * * *的* * *知识,但实质上女王和领主只是与中间人达成了一个关于* * * *的* * *知识。你可以想想是什么原因造成了这种误解。
其实背后的原因并不难理解,因为通信双方没有其他手段来判断接收到的公钥与通信对端的持有关系。我们也将这种密钥交换称为“未授权”密钥交换,如下图所示:
那么如何解决MITM的主动攻击呢?我相信你能猜到认证密钥交换。让我们通过一个具体的业务场景来看看为什么我们需要这种认证模式。假设我们开发了一套提供时间信息的服务,服务部署在阿里云。为了防止时间数据被恶意攻击者修改,我们使用MAC(消息认证码)。如果你对MAC没有任何概念,可以参考作者之前的文章。
MAC需要一个密钥来保护数据的机密性和完整性,所以我们在部署应用的时候会生成一个密钥,然后这个密钥通过某种方式非法的给了所有的客户端用户。应用程序运行非常稳定,并且由于密钥的存在,所有守法的客户端都可以读取准确的时间。但是,一位客户在得知这篇文章后,发现这个秘钥可以用来篡改数据,于是我们的网站被大量客户投诉读取时间不准确,导致系统的业务操作和数据处理出现问题。
你让建筑师赶紧处理。建筑师给出了一个方案,每个用户可以生成唯一的密钥。虽然可以止血,但是你很快就会发现这个方案不可行,无法操作和维护。随着用户数量的激增,如何配置和管理这些密钥已经成为一个大问题,更不用说定期更换了。密钥交换算法在这里可以派上用场。我们需要做的是在服务器上生成密钥,然后为每个新用户提供公钥信息。因为客户端知道服务器的公钥信息,所以中间无法模拟两个方向的MITM攻击。我们也称这种模式为:认证密钥交换。
让我们继续分析这个场景。虽然中间人表示也可以与服务交换密钥,但此时中间人与普通客户端没有区别,因此无法执行主动MITM攻击。
随着科技的发展,互联网在我们的生活中几乎无处不在,因此安全地建立通信双方之间的秘密密钥是极其重要的。但是我们前面介绍的模型扩展性不是很好,因为客户端需要预先预置服务器的公钥,这一点在互联网场景下尤为明显。比如,作为用户,我们希望安全地与多家银行网站和社保网站进行交流。如果我们需要预设各个网站的公钥信息,供手机、平板、台式机安全访问,那么你可以考虑一下便利性会有多差,我们如何安全访问新开发的网站。
所以,读者需要明白很重要的一点。密钥交换很重要,但是有上面提到的可扩展性问题,这个问题的解决依赖于数字签名技术。数字签名和密钥交换的结合是我们将在后面介绍的SSL技术的基础。需要很长时间才能说清楚,所以后面会用专门的一章来介绍SSL原理。不过,为了后面介绍的顺畅,还是先说几个具体的密钥交换算法以及背后的数学原理吧。
先说作者系列第一篇文章提到的Diffie-Hellman密钥交换算法。Whitfield Diffie和Martin E. Hellman在1976发表了一篇开创性的论文,介绍了DH(Diffie-Hellman)密钥交换算法,被称为“密码学的新方向”。这篇论文之所以被称为开创性,主要是因为它有两个第一:第一个密钥交换算法和第一个公钥加密算法(或非对称加密算法)。
DH算法的数据原理是群论,这也是我们今天接触到的所有安全机制的基石。因为不是数学专业毕业,数学基础也不是太扎实,所以一直在犹豫如何从安全的角度继续深化。为了让这个算法更容易被读者理解,下面的内容会涉及一些数据的基础知识,相信有高中数学知识的同学应该能看懂。
引入群论,首要问题是明确定义什么是群。笔者查阅了相关资料,发现数学领域中的群体有以下两个特点:
1,由一组元素组成。
2.元素之间定义了特殊的二元运算符(比如?或者)
基于上面的定义,如果这组元素和上面定义的二元运算符满足一定的属性,那么我们称这些元素为一个组。对于DH算法,后面使用的群称为乘法群:定义乘法二元运算符的元素的集合。读者可能会问,那么这个乘法群满足什么属性呢?因为这部分内容比较多,我们就一一列举出来:
-结束了。集合中的两个元素由定义的运算符计算后,结果也在集合中。比如我们有一个集合M,有元素A,B,c(c=a*b),那么这三个元素符合闭包性质,集合上定义的算子是乘法。
-结合性(Associativity)。这和中学数学中的组合概念是一致的。你可以理解数学公式A× (b× c) = (a× b )× c。
-身份元素。集合包含单位元素,任何元素和单位元素的值经过运算符计算后都不会改变。例如,如果我们有集合M,它包含元素(1,a,b,c...),那么1就是单位元,因为1*a = a,a和单位元1都是算符算出来的,结果不变。
-逆元素。集合中的任何元素都有一个逆元素。比如我们有集合的一个元素A,这个元素的逆元素是1/a,算子计算元素A和逆元素的结果是1。
笔者必须承认,自己肤浅的数学知识可能会导致以上四个属性的解释让大家更加困惑,所以准备了下面这张图,希望对群体所拥有的四个属性有一个更加详细的补充解释。
在介绍了组、组属性等相关信息后,我们来具体看看DH算法中使用的组是什么样子的。DH算法中使用的群是由正整数组成的,大多数情况下组成群的元素都是质数,比如这个群(1,2,3,...,p-1),这里P一般是很大的素数,为了保证算法的安全性。
注:质数的数学定义是只能被自身和1整除的数,如2、3、5、7、11等。素数广泛用于非对称加密算法中。计算机专业的学生应该在大学期间编写过寻找和打印质数的程序。算法的核心是枚举所有的数,以便判断它们是否是素数,如果是,就打印出来。但是从算法的角度来说,这种穷举模型是低效的,所以业界出现了很多高效的算法,很快就能找到比较大的素数。
除了素数,DH算法使用的群的另一个属性是模运算符,具体称为模乘运算。先说模运算,和小学生的一些高空数学题很像,重在商和余数。例如,如果我们将模数设置为5,那么当该数字大于5时,回绕将从1重新开始。比如数字6取模5后的结果是1,7的结果是2,以此类推。模运算最经典的例子就是钟表,钟表一天有24个小时,所以我们用12个小时来计数的时候,下午的13个点称为1个点,因为13 = 1 * 12+1(其中1)。
那么我们来看看模乘的定义。我们以6为例,6 = 3 ^ 2。如果模为5,我们知道6全部等于(Congo to) 1moduo5,那么我们的公式可以写成:
3 × 2 = 1 mod 5
我们从上面的等式中得出一个非常重要的结论。去掉mod 5,得到3 × 2 = 1,所以3和2是倒数元素。
最后,我们来总结一下DH算法基础组的两个特点:
-交换律(交换律),一个群中的两个元素有交换律,即ab=ba。通常,我们称一个具有交换律的群为伽罗瓦群。
-有限域(有限域)。下面我们将详细介绍有限域的特征。
DH算法定义的群也叫FFDH (Refine Field Diffie-Hellman),而子群指的是群的子集。在我们通过定义的操作符操作子集中的元素之后,我们将转到另一个子组。
群论中一个非常重要的概念是循环子群。用白话文来说,就是你可以通过一个生成器(或基数)与自己相乘。对于以下示例,生成器4可用于子组1和4:
4 mod 5 = 4
4 × 4 mod 5 = 1
4 × 4 × 4 mod 5 = 4(重新开始,也是循环子群的体现)
4 × 4 × 4 × 4 mod 5 = 1
等等
当我们的模是素数时,那么群中的每个元素都是一个生成元,可以生成一个循环子群,如下图所示:
最后,我们完整地总结了由群和DH定义的伽罗瓦群:
-群是定义二元运算的元素的集合,具有闭包、关联、单位元、逆元等性质。
由-DH定义的群称为伽罗瓦群,组成该群的元素是素数,模乘运算定义在该群上。
-在DH定义的群中,每个元素都是一个生成元,与自身反复相乘后产生一个子群。
组是许多加密算法的基础。笔者只介绍一点粗浅的知识。如果读者对这部分感兴趣,可以查阅相关资料。有了对小组的初步了解,下篇文章再来介绍DH算法背后的工作原理,敬请期待!