安全是云计算时代悬在每个架构师头上的达摩克利斯之剑,我们在享受云计算带来的红利的时候,由于系统的复杂程度成倍的增加,系统的受攻击面越来越宽,任何微小的失误都可能造成不可估量的损失。就如同悬挂达摩克利斯剑的那根马鬃一样,随时都可能断裂,夺取我们的生命。
密码学(Cryptography)是一门古老的学科,主要研究如何保护信息不受恶意攻击者的破坏。由于这个领域涉及很多基础知识,并且很多是跨学科的知识,要精通或者熟练掌握非常不容易。很多同学都会密码学很感兴趣,但是由于在学习和使用的过程中会遇到诸多挑战,不了了之的占大多数。笔者在过去多年中也是一样,但是在顿悟之后,决定从自己的视角,以一个初学者能接受的方式,来循序渐进的介绍密码学,加密以及安全。为了让学习更加有趣,哪些枯燥无趣的数学公式不会占据大部分篇幅,取而代之的是从实践出发:加密是如何提供通信安全?如何在复杂和充满恶意的互联网环境中识别潜在攻击者?如何防止机密信息被恶意攻击者窃取?等等。
中外的名言里都有这么一句话:没有付出,就没有回报(no pain,no gain)。而对于安全和加密技术而言,学习过程总我们会遇到诸多挑战,但是弄懂了每个知识点后,我们会收获丰富知识。
如笔者多次强调,安全是个宽泛的领域,你可能听说过网络安全,系统安全,容器安全,应用安全,API安全,数据安全,信息安全,流程安全,0信任等等,而从这些安全领域的角度看,加密技术的整个安全大厦的基石,因此无论你是开发人员,还是系统架构设计人员,SRE以及网络工程师,深刻理解加密技术对构建安全系统来说至关重要。笔者希望大家记得开篇提到的达摩克利斯之剑的故事,任何微小的安全失误,都可能给企业造成难以承受的损失。
【密码学要解决的问题是提供一套安全交换信息的协议】
为了让读者的阅读体感更好,我们从密码学的介绍开始讲起,笔者粗浅的认为整个密码学科学研究的目的就是要解决:如何保护信息不被恶意入侵者窃取或者蓄意破坏。
注:协议这个词对于搞信息技术的同学来说,应该是屡见不鲜。而笔者的这篇包括后续的多篇文章中,对于协议这个概念的定义是:多个参与者(包括潜在的恶意参与者)为达成目标而需要遵守的协作的流程。我们来举个例子,假设你是个剑客,长途跋涉好几天,碰到一棵大树,需要休息片刻。那么问题来了:如何让自己的宝剑在无人看管的情况下在大树下小睡一会?如下是一种可行的协议:1,你把自己的宝剑插在大树的旁边;2,在大数底下小憩;3,睡醒之后将宝剑从地上拔出。聪明的你一定会跳起来说,这是一种糟糕的方法,因为任何经过的人都可以在你熟睡的时候,从地上拔起宝剑,然后消失的无影无踪。而对于安全加密协议来说,就是在信息交互的过程中,考虑这种”恶意“的情况,使得想占便宜的参与者无计可施。
在古欧洲,领主和将军们大部分时间都在忙于相互背叛和政变,但是他们在每天的算计中遇到很难解决的问题:如何和同党共享机密的政变信息(如果信息泄露,还没有政变就被干掉了,因此保护信息安全比我们现在面对的场景重要多了)。
为了相互叛变更加容易实施,数学家们发明了密码学,对信息进行加密传输的想法应运而生。经过数十年的尝试和探索之后,特别是随着科技的发展,密码学已经成为一门科学,有很多划时代的研究结果,并已经充分利用到我们现代生活的方方面面。在信息科技几乎渗透到我们生活方方面面的今天,可以说我们每天都会直接或者间接的利用加密技术为我们提供的安全红利,在充满恶意和安全风险的网络环境里,享受安全和稳定的科技和信息服务。
当然笔者本篇或者后续的系列文章主要围绕信息加密的落地实践,不会涉及太多复杂的数据原理和数学公式,坦白讲也没有哪个能力。因此笔者会通过具体的应用程序的设计和开发场景,来逐步介绍目前使用最为流行和广泛的加密安全协议,探讨每个加密算法的具体原理和过程,以及着不同的组件是如何协作,来实现密码学的目标:让信息交互的两方能安全的传递机密信息。当然完全不介绍数学公式也不太现实,能够成为科学的学科都必须是数学可证明的,这个非常关键,因为科学需要保证相同的输入在任何情况下都应该有稳定的输出,这其实就是函数的概念。
因此如果读者对加密技术的原理有非常高的兴趣,或者想知道如何使用加密技术来构建更加安全的应用,或者想知道加密技术是如何支持我们日常生活中需要的信息安全场景,你应该详细的阅读这篇文章,并且如果有志同道合的朋友,也欢迎将本篇文章分享出去。笔者希望这篇文章能够激起读者尘封已久探索技术原理的兴趣,通过庖丁解牛式的的分析,来带领读者深入理解不同类型的加密技术,以期能够为大家在云计算和云原生时代,奠定足够的技术基础。好了,废话不多说了,我们先从最简单的对称加密算法开始,来详细的认识一下,请继续阅读。
【对称加密算法】
对称加密算法可以说是密码学一个非常基础的加密方法,并且大部分更加复杂的加密算法或多或少都会依赖于对称加密来工作,因此我们需要打好基础,先把对称加密给吃透。学过信息安全,或者读过密码学等经典文献的同学会说,这个太简单了,根本就不值得一提。切确对称加密的原理很容易理解,但是容易理解并不代表原理上的简单,因为我们看到的是结果,但是这个理论最终能被广泛使用,经历了非常复杂的演进,因此还是有必要深入的学习一下,即便是两句话就能说清楚。另外为了让讨论不至于很枯燥,我们在本篇文章,以及后续的一系列文章中,会使用女王Alice和领域Bob这样的两个角色,以期把具体的算法融入到具体的业务”场景“中,比如在王国内八卦信息传递。
我们从Alice女王和Bob领主遇到的问题开始说起:假设Alice女王需要给远在数英里之外的Bob领主发送一封机密信件。Alice女王将信件交给自己最忠诚的信使,女王最信任的信使骑着骆驼,一路披荆斩棘,浴血奋战,穿越荒蛮之地后越过边境,将信件交给领域Bob。虽然说信件安全被信使冒着生命危险送给了领主,但是女王是个多虑的人,因此即便是跟着自己多年的信使,女王还是担忧信件上的内容是否可能在送信的过程中,被”经手人“偷看,比如信使自己。因为信件上的内容极具争议性(应该是王国内某些大臣的趣闻,就如同咱中国人喜欢看大清秘史一样),Alice女王希望信件上的内容在送信的过程中,能始终对所有人保持机密。关于机密性,女王派信使传递机密信息的图示如下:
为了实现女王能安全的传递八卦信息,我们希望有这么一套安全的信件投递协议。这套协议能让Alice女王将机密信息(信件)亲自交给领主Bob,机密信息对中间人不可见,即便是信使会负责把信件从女王带给领主Bob,但是机密信息对信使和经手人统统不可见。当然最安全的方式女王直接和领主Bob定期在线下相见,可以安全的八卦,但是这不是很现实,女王工作很忙,并且和领主Bob相见需要穿越不毛之地,因此需要更好的办法,因为只要有经手人,信息都存在泄漏的可能。
为了确保信件在投递的过程中,经手人(包括信使)对女王发给领主bob的机密信息不可见,我们引入了加密机制,而解决女王和领主Bob可以机密”八卦“的安全方案,就是使用被称为对称加密的算法。
注:对于加密算法,通常我们也称之为加密操作“原语”,读者可以把操作原语理解为加密操作过程的最小单元,而协议就是由多个操作原语组合而成。
有了加密算法,接下来我们看看使用对称加密原语是如何解决爱丽斯女王和Bob领主的问题。对于对称加密,我们首先定义两个加密原语,如下所示:(读者可以把加密原语理解为看不到内部如何工作的黑盒)
提供了两个功能:
- ENCRYPT(),用来对输入的信息进行加密,从加密后的密文无法推到出原始信息。
- DECRYPT(),用来对密文进行解密,获取原始信息。
我们先来聊聊第一个加密原语ENCRYPT()的工作原理。ENCRYPT()加密原语接受秘钥和原始信息,经过黑盒的内部处理,输出一串看似随机的字符串,我们把这串看起来啥都不是的字符串成为密文。如下图所示:
对称算法提供的第二个原语是DECRYPT(),解密操作可以看成是加密操作的逆向操作,因此对于解密原语来说,输入秘钥(和加密原语相同的秘钥)和收到的密文,获取原始的数据信息。如下图所示:
到这里为止,不知道大家发现问题没有,虽然看起来有了这个对称加密的原语,女王爱丽斯和领主鲍勃可以安全的八卦了。且慢,图中的钥匙样秘钥从哪里来?如果爱丽斯女王让信使把自己确定秘钥穿越荒蛮之地投递给领主鲍勃,那么又如何保证秘钥不被泄漏呢?这是典型的先有鸡还是先有蛋的问题。解决这个问题也不难,在远程八卦之前,爱丽斯女王和领主鲍勃需要先进行一次线下的会议,两人会议的核心是确定后续八卦使用的秘钥(图中钥匙🔑状输入)。
确定了秘钥之后,在后续的日子里,女王有八卦信息后,激动的想要和领主鲍勃分享的时候,女王Alice就可以从自己的密室中拿出提供加密原语支持的黑盒子,输入八卦信息和领主鲍勃线下会上上确定的秘钥,使用黑箱的功能ENCRYPT()原语来生成密文,然后女王将装有密文的信件交给信使,最终密文经过多次转手之后交给了领主鲍勃。领主鲍勃也从自己的百宝箱中拿出提供对称加密原语的黑盒,输入密文和秘钥(线下会议的成果),通过黑箱的DECRYPT()原语,解密出女王给自己的信息,然后哈哈大笑,我一定要把这个八卦信息讲给君王史塔克。当然领主鲍勃和君王史塔克可以使用相同的协议来继续传递八卦,突然觉得区块链或者分布式系统中的Gossip协议就是这么来的。如果我们把前边两个图合在一起,使用对称加密来支持女王爱丽斯和领主鲍勃安全的沟通八卦的整个过程如下图所示:
如上图所示,女王Alice发送机密信息给领主Bob的过程详细描述如下:
1,女王爱丽斯使用对称加密原语ENCRYPT()将八卦信息转换为密文;
2,女王将密文(注意不是明文,信使即便是能看到密文,也不知道具体说的是啥)交给自己最信任的信使,信使负责穿越蛮荒之地,将密文转交给领主鲍勃;
3,领主鲍勃收到信使的密文后,通过对称加密原语DECRYPT以及和爱丽斯女王线下商定的秘钥,解密出女王发给自己的原始信息,看完后会心一笑。
笔者特别要强调的是,由于在消息的传递过程中,信使包括所有中间的经手人,比如信使在大树下小憩,刚好有经过的小贩,即便是在信使不注意的情况下,在好奇心驱使下偷偷看了女王发给领主鲍勃的密文,但是看到的是一堆随机的字符串,啥也看不懂,保证了信息的机密性。
从女王爱丽斯和领主鲍勃的例子可以看出,我们通过使用对称加密原语,把原来不安全的协议(女王通过信使和领主鲍勃沟通八卦信息)进行了增强,从而得到了一个安全的协议(通过使用对称加密黑盒提供的加密和解密操作原语)。新的安全协议让爱丽丝女王和领主Bob可以安全的八卦,而不用担心这些信息被其他人窥探,从而在王国造成舆情。
我们把这种通过将原始信息转换成“无法通过肉眼”识别的密文的过程,称作加密。而在在我们的例子中,使用的是一种称作加密算法的方式,来保护爱丽斯女王和领主Bob之间八卦信息的传递。加密算法是我们用来进行数据安全保护的一种通用的机制,而对称加密是一系列被称为“对称加密算法”中的一种,有时候也成之为“秘钥加密算法”,主要的特征是相同的秘钥被多个加密操作原语共同使用。这就是我们关于安全一系列文章第一篇的所有内容了,下一篇我们先介绍柯克霍夫原理,然后介绍我们的第二个加密算法,非对称加密,敬请期待!
后记,今天是教师节,我觉得只有认真从学生的角度考虑过问题的同学,才能体会之中的不易,每个人的基础,理解能力,因此对老师的经验,耐心,爱心要求都非常高,特别是需要具备同理心。借着这篇文章先说声老师辛苦了,特别是笔者家里的老师和老师们。