【Internet History, Technology, and Security】第八讲心得
结束了网络协议的介绍后,本周要介绍的是网络安全。
Security Introduction
网络安全其实离我们并不遥远,这里有个简单的例子。假设有两个人叫做爱丽丝(Alice)和鲍勃(Bob),也许是因为异地的原因,他们希望在网络上交流一些比较私密的信息,但这时候,可能会存在着一个心怀不轨的人,我们把他称之为C。爱丽丝和鲍勃希望自己发送的一些信息不会被打扰,然而C就在那里偷听,又或是有别的不轨的企图。如何让A与B安全的交流?这就是网络安全要做的事。
这个简单的例子应该可以让你明白安全的重要性,而在我们的日常生活中,我们也会面临信用卡信息被盗的风险,毕竟金钱才是最具有诱惑力的东西,不过如果你是一个政客,那么就会有一堆人试图窃取你的电子邮箱,因为这里面存放的信息价值大于金钱。因为意识到了安全的重要性,很多公司会把越来越多的钱花在安全上,但这样又是一种错误,因为安全也只是一种成本效益的分析,它并不存在完美解答。
对于安全性,这里要提到两个术语,一是Confidentii,保密性,指信息的泄露,如果我想把一个信用卡号码发送给某人查看,除了这个我想看到它的人之外,没有人能得到它,那就说明是保密的;另一个问题是可靠性(Integrity),也就是说,在某种意义上,你知道A,你得到的信息来自于你认为它来自的人,它没有在路上被修改过,所以像数字签名这样的东西就属于这一类,以及之后要讨论的其他机制。
Security - Encryption and Confidentiality
二战时,布莱切利园(Bletchley Park)的工作就是负责加密以及解密,这里要提到两个术语:明文(plaintext)与密文(ciphertext),无论是文本信息或者是其他类型的信息,我们想要传输的信息被称作明文,例如信用卡信息、数字或者是其他的重要信息,这些信息有相对应的加密版本,我们称之为密文。对于密文,有可能会被第三方截取,所以加密者自然希望破译密文这一过程会十分困难,加密是将明文变成密文的操作,将密文还原为明文的操作则是解密,加密解密还需要钥匙,钥匙本质上是一些数据,通过特定的算法来实现加密与解密,讲到这,就又引出了两个术语:密钥(private key)和公钥(public key)。
首先我们要讨论的是密钥,密钥加密系统的使用从罗马和凯萨时代开始,一直到第二次世界大战,密钥也被称作对称密钥,意味着发送方与接收方都拥有同样的信息,简单来说,加密与解密使用同一把钥匙,那么密钥的缺陷在于,你需要一个绝对安全的交流环境,例如双方坐在同一个房间里,你直接把密码本递给对方,无论如何,你需要一个安全的方式来传递密钥。加密的主要流程是这样的:你有一段明文,比方说Alice想发送“candy”这个单词,你将通过字母的替换来加密,把每个字母替换成下一个字母,我们得到了D-B-O-E-Z,这就是Alice加密后的密文,Alice通过路由器或者是莫尔斯电码,把这段密文发送到外界,这样这段信息可能被第三方C截获。他并不能截获明文,我们假设加密解密的过程是安全的,只有中间传输的区域是危险的,我们只担心C获知明文的内容。同时,由于Bob知道密钥,他可以解密密文从而得到明文,另一方面,C并不知道密钥的内容,他只有截获的密文。她不得不像布莱切利园一样,推算出密钥或明文。凯撒密码是一种最古老的、被广泛使用的加密形式,采用的是替换概念,比如前面所说的就是规则为1的替换,这种加密方式被使用了很长的时间(视频中同时演示了破解的方法)。
可以说,如果你知道某段明文的内容,你只需要解密一个字母就可以破解全部,我们可以猜测这个发信人可能会发送什么明文,这就导致了信息的泄露,这与密钥的数学严谨性无关,这是另一种形式的信息泄露,第三方则可以利用这一点发送错误信息。
在Facebook跟Twitter诞生之前,有个叫做新闻组的东西,他们是一些电子邮箱地址的集合。在80年代,这被用于存储转发网络,就像今天的Facebook一样,意味着你要花四个小时才能看到个人状态的更新,但有些人仍旧订阅了这些内容,因为其中有一些荤段子(笑),然而在这些荤段子里系统并不允许使用脏字,有软件会自动过滤文本中的脏字。如果你在荤段子里使用了脏字,你将不能发送你的信息,所以发送者必须想办法加密含有脏字的信息,
于是他们用了一个简单的凯撒密码来解决这个问题。
而公钥则在20世纪60、70年代才开始应用,公钥则是不对称的,意味着加密与解密用的钥匙不同,公钥加密系统能使用不安全的媒介实现钥匙的传递。
Security - Integrity and Signatures
讲完了保密性,接下来就是可靠性。在罗马时代,人们寄信时都会用特制的印章来密封信件,他们会把它戴在脖子上,以确保没有人偷它,在计算机世界里,我们自然也需要相同的“防伪”,来保证发送的消息的可靠性。
这种技术叫做密码散列(Cryptographic Hashing),它是一种计算机软件、一种代码,它将一大块数据重组成固定长度的数字,就像是它消化了这些信息,然后给了你这个小小的数字签名。众所周知的密码散列技术,你可能听说过,比如SHA1或MD5,它们能接受信息并创建摘要,这是一种科学的、数学的研究努力。
而密码散列技术在我们生活中最直接的用途就是各类网站的登陆。在过去,用户的信息是以纯文本被存放在数据库中的,但很显然,这是一种很危险的方式,因为如果数据库被破坏了,那么所有的坏人都会得到所有的明文密码。所以当密码散列技术诞生后,这些网站就开始将用户的信息进行哈希加密并储存,这样在你下次登陆的时候,系统就会根据算法,将你的信息与数据库中已经被加密的信息进行匹配。
接下来谈谈数字签名,我们要如何使用它来验证消息完整性?数字签名的作用从某种意义上来说,就是在你输入密码的时候,验证线路另一端就是你要联系的人,就像你的驾驶证一样,数字签名是验证身份的方式。
一个小例子可以加深你对这个概念的理解:如图所示,在圣诞节,我们收到了来自安妮的信息,她希望吃更多的Ovaltine(一种饮料),那么我们要怎么确认这个信息来自安妮?这是一条公开的信息,它可能会被其他人篡改,并重新寄给你,就像是安妮本人寄来的一样。所以,假设现在我们和安妮一起住在一个共用的房间里,她告诉我们在她发送的信息中会添加怎样的签名,那这样我们就能很容易地判断,这条信息是不是她本人发出的。
就像下图一样,我们与安妮约定“Santa”为结尾,作为数字签名,然后通过SHA-1计算来运行它,安妮将想要发送的信息与这个签名一起加密,可以看到,这时候签名加密计算的结果为a79540。当我们收到这条消息的时候,就可以进行核对是否被修改。
就像这样,如果在途中存在有心之人,截取了这条消息,并试图传达错误的消息给另一端时,哈希加密就会呈现出不一样的结果,很神奇吧?
可以看到,数字签名实际上非常简单,不需要很多复杂的技术就可以很容易地完成,这里唯一复杂的技术实际上是,使这些密码散列有效工作的聪明的数学。它是一个秘密的简单串联,但归根结底,数字签名的概念实际上是一个简单且相当优雅和美丽的概念,它以一种非常酷的方式真正利用了密码缓存的概念。
本次课程的例子非常生动形象,听完以后有种想网购Ovaltine的冲动(笑)。