网络传输与加密

谈到网络,就必然会涉及网络安全。但“安全”这个事情, 一下子就会让人联想到黑客,进而把“安全”这个事情无限放大为各种高大上、神秘莫测、不可知。这不是一个engineer应有的态度(《一次艰难debug的反思》)。

要讨论网络安全,可以从最核心的“加密”谈起。

加密,英文叫encryption。显然,无论中、英文,都不太能够从字面文法上,给人以直观的联想和理解(这是典型的“装X亮词”的特性)。那更接地气的直观说法是什么呢?按我的话来说就是:把信息搞成乱码。

例如,你想要向一位妹纸传达信息“下午3点,不见不散”。可这条信息因为你计算机上的编码问题,被显示成了“绯荤粺绻佸繖,璇风”。这件让人头痛的事情,其实就是高大上的“加密”了。因为信息已经被弄得面目全非,无法识别,成了秘密,也即是为信息加上了“秘密”这层属性。

一般来说,这个被弄成乱码之前的信息,就叫做“明文”,也就是光明正大的、没有任何秘密可言的、谁都看得懂的文字信息。而看不懂的乱码,就被叫做“密文”,因为它到底表示什么意思成了一个秘密。

密码学,从本质上来说就是研究如何把信息“按照一定的要求和限制”搞成乱码。这堆要求和限制大都很奇葩,比如神马:被弄成加密信息的乱码要有办法被恢复成乱码前的样子(也即是密文要能恢复成明文),乱码的长度要保持一致、“几乎不可能”找到两条不同的信息被搞成相同的乱码、原信息仅仅是有微小的改动就会造成加密后的乱码产生巨大的不同,等等。

在这么多的限制条件下,要设计出一套方案(或者说算法)使得信息既能够被搞成乱码、还能够满足特定的约束条件,就变成了一件不平凡的事情。而这一块的内容,通常由数学家来完成,特别的,是由做代数分支的数学家来完成。

理解了“加密”就是“把信息搞成乱码”,再来讨论网络与加密的关系就容易多了。

如《网络概念与快递物流 | 墙与梯子》中所说,网络的基本组成就三部分,起点A、中点B以及连接AB的一根线,如下图

这个简单的基本模型,不仅适用于网络,更是适合从古到今所有的信息运输方式,如古代的飞鸽传书、快马送战报。很显然,这个信息传输模型中,最脆弱的环节就是中间那根长长的线。你几乎无法控制、也无法预料,在信息被传输的这个过程中,信息是否会被拦截、是否会被更换等等。

那怎么办呢?一个直观的想法便是上面提到的方法——加密,也就是把信息搞成乱码。这里的重点是:你并不是要阻止信息被拦截,而是就算其他人拦截了你的信息也没用,因为看不懂。所以,这是第一个要澄清的关于网络安全中加密部分的理念:并不是有什么黑魔法,使得在网线、光纤中流动的数字信息不被拦截,而是即便是这些信息被拦截了,也无法搞清楚这些信息到底是什么意思。

那么,要完成整个通讯的流程,仅仅是把信息搞成乱码(加密)是不够的,你还必须有办法把乱码恢复成原来的样子(解密),这就涉及到“秘钥”这个概念。顾名思义,“秘钥”就是解开秘密的钥匙,也即是把乱码恢复成以前样子(明文)的工具。这个工具是什么呢?是另一串乱码,可以长成这个样子:“KH2J9-PC326-T44D4-39H6V-TVPBY”。

为什么靠这串乱码就可以恢复呢?这涉及到加密算法的数学理论,我们可以暂时忽略这部分的细节。反正根据一系列的步骤和数学操作,可以使用被称为秘钥的乱码,把加密的信息乱码恢复成原来模样。

解密需要秘钥,这很容易理解,但事实上,加密的过程其实也需要秘钥,你可以把它理解为上锁(搞成乱码)的钥匙。通常,用于加密的钥匙叫公钥,因为它可以被公开散布在各个地方,被用来把信息变成乱码。而解密的钥匙,当然就私密了,不是人人都可以得到的,所以被叫做私钥。

到这里,或许你或许会下意识地认为:有了“加密、解密”,安全领域需要的工具似乎就都齐备了。那你就too young too simple了。事实上,我们还需要立马要介绍的“验证工具”。除了它字面意思被用作验证以外,更重要的是,它能够和加密解密工具组合起来,完成更加高难度的动作!

目前常见的验证工具有MD5和SHA-256,其本质也是一堆算法,也是用于把一堆信息搞成乱码。例如,一个文件“fileT.tar.gz”被MD5算法作用后,会变成字符串“38b8c2c1093dd0fec383a9d9ac940515”。乍一看,这似乎和上面讨论的加密解密没啥区别。可他们的目的,却完全不同。

验证工具的目的,不是为了加上一道锁再打开,而是为了给出一种方案去保证你“实际拿到”的东西确实是你“期望拿到”的东西。如同“加密”,这个验证过程也有一个装X且让人傻傻看不懂的专业术语——签名(signature)。等我们弄清楚了验证过程,再来考察这逼格满满的术语。

既然是“验证”,那么回到生活场景中,便是那个老大难的问题:你怎么证明你是你自己?客观来说,这个问题其实挺难回答的。特别是,如果你要把这个判断标准扔给计算机,你发现你很难找到一个合适的方式去描述你的特性,从而证明你就是你这么一个哲学问题。

那么,密码学是如何处理这个问题的呢?它的想法比较简单,就是考虑用之前提到的加密(搞成乱码)的某个约束条件:即便是原信息(明文)有微小改动,也会造成加密后的信息(乱码)的巨大不同。例如,字符串“hello”被md5作用后,会得到乱码“b1946ac92492d2347c6235b4d2611184”。而仅仅有一字之差的“hello1”被md5作用后却会得到“b52731692f35498bba7e4660142129d2”。

如果跳出来看,我们可以这样理解:任意一个东西A,被md5作用后,它就能够得到一个特性,这个特性由128位的字符表示。而任何另一种东西B(哪怕B和A非常的相似、仅仅只有毫厘之差),被md5作用后,会得到一个非常不同的属性值,即非常不同的128位的字符表示。那么,这个被md5作用后的值,其实就可以被用来判定“A是否还是A”。就像是一个人的签名手法各有不同,所以这个用来判定“你就是你”的128位字符串,就被称作签名。

(当然了,经md5作用后生成出来的签名字符串只有128位。从安全性角度讲,能够暴力破解的几率还是不够小。那么,如果要求更苛刻一点,就可以考虑SHA-256,能够生成256位的签名字符串。SHA-256比起md5可不是多出了一倍,而是2的128次方倍!)

如果经常下载软件的同学,想必早已见过md5。通常,稍微正规的软件下载网站,都会在可以下载的二进制文件(不明白的同学,可以简单粗暴地把它理解为exe文件)旁边,放一个md5码,用于验证。

一个直接的问题是,有这个必要性吗?或者说,需要搞得这么复杂吗?!

我的回答是:太尼玛有必要了啊!

且不说你所在的下载网站是否会提供恶意软件,让我们先暂时假定你所用的下载网站是良心商家运营的,他的本意是为用户提供正当的软件。可是,如果这个下载过程的数据,被恶意劫持、被替换成一个拥有相同功能但却会有一些后门和恶意操作的软件数据。

请问,有什么办法去区别、去确认你所下载的软件就是网站为你提供的软件吗?

回忆刚才我们讲的内容,这不就是让你去证明:A(网站提供的下载软件)就是A吗?那么,根据我们刚才的讨论,用md5就太合适了。你只需要把你下载的软件,让md5函数作用一遍,便能得到一个签名字符串。你只需要去比较“你生成的签名字符串”是否和“网站提供的md5签名字符串”一致。并且,你知道,哪怕这个软件仅仅是被做了微小的改动,这个md5签名字符串也会变得面目全非。

这样你就能够理解md5的强大和实用了。

那么,有了加密工具、有了验证工具,能够玩儿出什么花样呢?

网络传输与加密 (2)

  

近期回顾

为什么需要提前撰写Spec文档
2018年06月写字总结
叫兽的逻辑 | #Metoo

 

如果你喜欢我的文章或分享,请长按下面的二维码关注我的微信公众号,谢谢!

   

更多信息交流和观点分享,可加入知识星球:

原文地址:https://www.cnblogs.com/kid551/p/9409861.html