Internet History, Technology and Security (Week8)

Week 8

This week we start two weeks of Internet Security. It is a little technical but don't worry - we stay at a very high level and I am confident that if you are still keeping up with the class that you will enjoy these next two weeks. You won't know enough to be an expert - but many of the security issues that you read about going forward will make a lot more sense to you.

The topics we’re covering are encrypting and signing. Using simple examples, we examine how to shield data from prying eyes and make sure that the data was not altered while in transit.

Security: Encrypting and Signing

coursera address

Hiding Date from Ohters

KeywordAlice and Bob, Paranoia, Security is a Tradeoff

Security Introduction

在开始对安全领域进行深入研究之前,我们应该先了解一些基本思想。

Alice and Bob

Alice_and_Bob ,是密码学里的一种常见的说法。Alice和Bob,这两个名字都是用于模拟在密码学、博弈理论、物理学研究中的原型角色。这种特殊名字的运用使得我们在讨论相关技术话题时,能够采取一种更加通俗易懂的说法。For example,“Alice发送了一条信息给Bob”比“A发送了一条信息给B”更加让人容易接受,而且这种表示法很常用。

Alice and Bob are two commonly used placeholder names. They are used for archetypal characters in fields such as cryptograph, game theory and physics.[1] The names are used for convenience; for example, "Alice sends a message to Bob encrypted with his public key" is easier to follow than "Party A sends a message to Party B encrypted by Party B's public key." Following the alphabet, the specific names have evolved into common parlance within these fields—helping technical topics to be explained in a more understandable fashion.

一般来说,Alice和Bob(A、B)是形容好人的。Alice发送一条信息给Bob,就是参与简单的通讯的双方。当然这个模型里也会出现一些不怀好意的人(People with bad intent)。常见的用法有:

  • Carol、Carlos、Charlie,形容通讯的第三个参与者。
  • Chuck,通常是指代怀有恶意的第三个参与者。
  • Dan、Dave等,指代第四个参与者
  • Eve,指代窃听者(eavesdropper,英文单词eavesdrop有“屋檐上流下来的水”,同时又有动词“窃听”的意思)。Eve不仅可能窃听Alice和Bob之间的通讯,还有可能对信息动手动脚(modify)

当然,这个用法不仅只有ABCDE五种人,除此之外,wiki中列出常见的用法还有16种其他人名,具体详见wiki页面的Cast of Characters。

Paranoia(妄想症)

其实道理很简单,看到这个标题,我不是要叫你们做“被害妄想症”,而是“害人之心不可有,防人之心不可无”。

时常想想——Who is out to get you? 如果你是普通人,那么你的个人信息有可能被一些别有用心的人盗用之后卖掉赚钱(现在这种情况真的很多)。如果你是名人、有影响力的人,或者说你开了一家公司,有很多竞争者,那样想盗取你的隐私、或者破解进入你的邮箱的诡计就更多了。

我们通常会认为这种破坏分子是bad guys,“坏人”。但老师说了句大实话,谁对破解他人的信息最感兴趣?谁最想无时不刻看着别人在干些什么?government。

So who is out to get us? Well, the government. So now we're going to actually turn the tables(注:上下文是在讲二战时的密码战), right?

我觉得有的时候,没有那么多“好坏之分”。同盟国获得了二战胜利,所以德军在加密方面的那些技术就是“阴险的勾当”,而在Bletchley发明的那些Bombe解码机、Colossus计算器就是“胜利的战果”,但假设(我只是说假设),假设德国是胜利者,或者你站到德国人的立场上,那么Bombe、Colossus才是破坏分子,不是么?总之,成王败寇的事儿,也就不消细说了。

(这里还有一个个人体会,总觉得用英语交流关于government的这样的观点时觉得还比较正常,交流时也很自然,不觉得奇怪,例如在英语角和老外谈天说地时常有人讨论美国大选。但很少与别人用中文谈论这方面的政治观点)

Security is Always a Tradeoff

这里老师说,他有些遇到的所谓“安全专家”十分的烦人(annoying),甚至给人一种盲目自大(pompous)的感觉。(注:这两个用词都比较重了,没想到然后老师就说“我希望此时在看视频的你不是一位安全专家、或者是数据库管理员、安全员。”,哈哈老师好可爱、、

老师在这里抛出了几个观点,可以总结为下面两条

  1. “perfect security”,完美的安全,或者说: 万全之策、滴水不漏,那都是谬误(fallacy),不应该有这种想法。
  2. “More” is not always better。Must find a tradeoff。“安全”这玩意,不是越多越好。我们只能去寻求折衷

还记得,“perfect is the enemy of the good”吗?对于安全问题这句话尤为施用。不能落入Perfect Security的误区中。很多公司轻信“安全专家”所说,花大量金钱想达到“越来越安全”。如果你想要高级别的安全措施,那肯定要投入更多的研发资金。“万全”有那么容易达到吗?所以如果要钻牛角尖,那肯定是个无底洞。

对于安全问题,我们应该采取的策略是折衷策略。这里举个很容易理解的例子,如果银行把信用卡、银行卡的安全机制做的很复杂,那样的话虽然安全系数上去了,但我们还能这么容易地去用银行卡购物、做交易吗?所以说无论是从便利性考虑、还是想多赚点钱,都不应该把银行卡搞成高级别安全措施的东西。

如果你为了安全考虑,让十个彪形大汉做你的保镖,无论你去哪、干什么都把你团团围住,想想都很不方便,(而且这样子也不一定就是“安全“了)。要认识到,1:想要追求安全,也是要付出代价的。2:安全不能是完美的,但也不必是完美的。

And so, understand that when you start getting into conversations with security, you, professionals. Sometimes they're the kind that understand that security is naturally imperfect. And everything is a cost benefit analysis, rather than more security is always better. So more is not always better.


Terminology

KeywordConfidentiality, Integrity, plaintext, ciphertext, encryption, decryption, Caesar Cipher, Cryptographic hash function, Message Signature

两个术语。之后的介绍也根据这两个术语来展开。

  • Confidentiality——Prevent unauthorized viewing of information.

    • 意味机密、保密性,这个主要是指不让不属于这场通信的人能有机会看到交流的信息内容。
  • Integrity——Information is from who you think it is from and has not been modified since it was change.

    • Integrity可以形容人身上正直、诚信的品质。用在安全领域是指“完整”,就是说,你收到的信息要跟发送者所发送的信息是一样的,而不能被他人修改。

Security - Encryption and Confidentiality

在Confidentiality中,我们主要讨论的是密码学方面的知识,加密解密、明文暗文等。

明文(plaintext)和暗文(ciphertext)指的不一定是文本文字,总之一切需要传递的信息,例如银行卡里的信息等等,有出于安全考虑的需要加密的,加密前就叫明文,加密后就叫暗文。

密钥(key),指的是一种机制或算法,能够将明文通过这套机制转换生成暗文。这种过程叫做加密(encrypt),反之叫解密(decrypt)。

密钥分为私有、秘密、公开三种。私钥(private)的是指私有的密钥。密钥是私密叫做秘钥(secret key)。公钥(public key)是指密钥是公开的,但是公钥这种思路相较密钥来说是很新的。

密钥还分对称性和非对称性。一般来说,秘密的密钥是对称的,加密解密用的是同一套。而公钥一般非对称的较多,得用一套加密,再用另一套解密。比较著名的公钥算法我知道的是RSA算法

有一个古老且著名的密钥是凯撒密码,是把26个英文字母按照字母表顺序以移动一定的位数来加密和解密。是非常古老的方法,而且应用了特别长的时间。机制很简单,所以保密性不高,暴力破解很容易,不能保障通讯的安全性。

得知自己破解成功的方法是:你翻译出来的明文是有意义的 (make sense)。不过有的时候,不一定是别人完整地破解完全部信息,你的密钥才会泄漏。有的时候,密文也是有弱点的,可以通过这些弱点攻击密文。例如一段经凯撒密码加密的长英文语句中如果出现了单个的大写字母,那么其对应的明文有极大概率是“I”;如果出现了单个的小写字母,那么有可能就是对应“a”。据此,我们不用从头到尾一个个试验过去,而是根据那个单一的字母去推测是按照移动多少位来加密的。

当年Bletchley Park在当时寻找的是德国人每次都会说的某种“规范字”(canonical things,也有“权威的”、“依教规”的意思,也许就像是唐僧会一直说阿弥陀佛那种的)

凯撒密码的破解方式是用上图这种密钥表,原理就是每行行首的数字n就是明文中每个字母向后移动n位之后所对应的密文。做了个简单的程序,破解一下下列经过凯撒密码加密的密文:

Uryyb, zl anzr vf Puhpx naq V arrq zbarl naq n wrg!

虽然通过那个大写的V,就能推测出对照的明文应该是I,就可以知道密钥,但我写了个暴力程序

#include<stdio.h>
#include<ctype.h>
void CaesarCipherTable(char * CipherText)
{
	int i;
	int Line = 2;

	for (i = 0; i < 26; i++)
	{
		if (i == 0)
		{
			printf("\nCipherText: %s\n", CipherText);
		}
		else
		{
			char *p;
			p = CipherText;
			printf("Line%d: ", Line);
			Line++;
			for (; *p != '\0'; p++)
			{
				if (isblank(*p) || ispunct(*p) || isdigit(*p))
				{
					printf("%c", *p);
				}
				else if (islower(*p))
				{
					if ((int)(*p + i)>122)
					{
						printf("%c", (*p + i - 26));
					}
					else
					{
						printf("%c", (*p + i));
					}
				}
				else if (isupper(*p))
				{
					if ((int)(*p + i)>90)
					{
						printf("%c", (*p + i - 26));
					}
					else
					{
						printf("%c", (*p + i));
					}
				}
			}
			printf("\n");
		}
	}
}

#define MAXLEN 100
int main()
{
	char CipherText[MAXLEN];
	printf("Please input a CipherText encrypted by Caesar cipher:\n");
	gets_s(CipherText);
	CaesarCipherTable(CipherText);
	printf("\n");
	return 0;
}

在算出来的26中移动顺序中,找到一行是有具体意义的,那就是我们要破解的明文。

之后还会讨论更复杂、更进一步的思想和算法。因为最普通的凯撒密码实在是太好破解了。


Insure Date Integrity and Signatures

有一天你生病了去医院,医生给你开了处方,你拿给药剂师,药剂师看到了医生的签名(知道了这是医生开的),才给你拿药

写信时,我们写上亲笔签名(signature),(这东西虽然说也能伪造吧,)有一种目的,就是为了让收信者确认这真的是发信人发的。

如果是出于“不让信件中途被人修改”的目的,那就是用胶水把信封粘好,当然,也可能被人暴力拆开。

在电脑的世界里,我们就是需要一种技术,确保数据的Integrity。

Cryptographic Hash

加密哈希表是一种广泛地应用于信息安全领域的技术。其主要的作用是避免数据被无意或恶意地修改。

Hash,散列表,通常直接被音译,读作哈希。除了这里要介绍的哈希加密函数外,还有哈希表等运用。

第一次登陆网站时,通常要注册用户名,也需要一个密码。靠谱的网站,数据库是一定不会以明文方式存储用户的密码的,因为如果一旦发生意外,明文密码泄露的后果很严重!数据库不存明文密码,那怎么让用户正确地登录自己的账户呢?很简单,数据库存储的是密码经哈希函数加密之后的一段固定长度的字符串。我们把这段字符串叫做digest,或者hash value。登录时,再把你输入的密码用hash过一遍,把两个hash value进行比较,如果符合,那就是登录成功。

数据库运用hash来存储用户们的密码,有两个很重要的特点是其不可逆无冲突不可逆是指one way operation。密码可以通过哈希加密成digest,但通过digest不能得出用户名的密码。这与加密和解密的过程不同。所以说,如果你发了一封邮件给网站管理员说“我忘了我的密码,请你把我的密码发给我”,并且网站管理员回信,告诉了你明文形式的密码,那么这个网站绝对有问题,因为明文形式存储密码是非常危险的。

无冲突是指不能有两段不同的信息经过某hash函数加密后生成两端相同的digest。

So, the best practice is to store a hashed version of it. To run, take the plain text of the password when you're creating your account, run a cryptographic hash on it, store the cryptographic hash.

采取这种方法,就算被黑客黑了数据库,那么黑客也得不到用户们的密码,因为他看到的是一堆乱七八糟无意义的digest。

好的HASH 标准:接受的信息大小可长可短,产生的电子签名长度都是一样的。只要信息有一丁点改变,那么电子签名都会完全不同。如果两个内容不同的信息经过某hash加密之后能得到同样的电子签名,那么这个hash就是失败的。

计算机界、数学界的专家花了很多年去寻找一个好的、合适的hash转换函数,其中比较著名的有SHA1(现在不用了,用的是更好的SHA256),MD5等等。对于哈希加密的研究也是一直在进行的。

Digital Signature Message Integrity

说完了网站存储用户密码的例子,那么在发邮件时要如何用hash加密来确保信件在途中没有被恶意篡改呢?

这个做法叫做Message Signature

假设Alice要给Bob发信息“Eat More Ovaltine”(多吃点阿华田),这里能证明这封信从Alice手中发出来在网络中传递时没有被篡改的一个关键是我们要添加一个secret,这个secret,只有Alice和Bob知道。假设,他俩实现约定了,这个secret是Santa,而且只有他们俩知道。

在写好了信后,发信前,我们把信的内容和secret的内容连接起来。也就是“Eat More OvaltineSanta”,然后对其使用Hash加密,保留加密后得来的digest。

之后,我们删去这个secret,再附上那个通过Hash加密后得来的digest(不一定是图中这么短,但形如a79540)。并把它作为我们要发送的信件,发送出去。(也就是说,我们发送的内容是 Eat More Ovaltinea79540)

Bob收到信之后,分离信的内容和digest,然后把信的内容加上secret之后(记住,这里只有Alice 和 Bob他们两人知道他们之间约定的secret是什么)再过一遍hash加密。如果信息的内容变了,Bob收到之后加上secret后,hash过后得到的digest必然会不同。如果得到的digest和Alice附在信件上的digest相同,那么就说明信件在途中没有被篡改。

哈希加密函数思路简单,内部机制不复杂,而且使用起来效率也很好。比较难的部分是设计那个比较好的hash函数。经过此番操作,信息的Integrity得到了保证。

不过这种东西不是百利而无一害的。为了安全,我们肯定得付出点代价。第一个就是通讯的每个参与者都需要知道那个secret。如果你是想给互联网上传递的email加密,那这个secret就得不能通过互联网去沟通了,得采取别的方法让其他通讯参与者知道这个secret(例如当面交谈、编写工作书面文件等等),这就加大了通讯的难度,降低了工作的效率。

See also

  • SHA1

    • 前面提到SHA1有缺陷,并不是指这是一个很差劲的hash函数。而是经过数学家们的努力,用数学证明的方式指出了SHA1是有小缺陷的。
  • 什么是哈希算法?

  • 王小云

posted @ 2017-02-05 17:42  畅畅1  阅读(419)  评论(0编辑  收藏  举报