从今天开始,我就和你一块儿去试着揭一揭密码学的面纱,看看里面的机关门道。
每当我们看到一个新鲜事物时,“这东西是什么,有什么用”这样的问题总是会最先浮现在我们的脑海里,诱惑着我们更进一步地去了解它。
那么,密码学是什么呢?它有什么用呢?这就是我们首先要讨论的事情。为了使问题更加直观,我们先从一个例子开始。
约个会能有多难?
我们先来做一个有趣的假设,假如马上要到七夕节了,河东的牛郎想要给河西的织女发一条信息,七夕相约鹊桥会。信息的内容是这样的:
织女:
七月初七晚七点,鹊桥相会。不见不散。
牛郎
可是,这封信该怎么送出去呢?银河又长又宽,两个人当然不能面对面地口头表达。这封信要想送给织女,只能通过中间媒介。传说中,有人认为这个中间媒介是喜鹊,也有人认为这个中间媒介是流星。反正不管怎么说,都没有证据表明,牛郎可以亲手把信交到织女手里。
不过,这次约会能不能成行,很大程度上就取决于这封信的送达能不能成功。特别是,银河这么长、这么宽,王母娘娘这么神通广大,这封信就更不好送了。
那么,牛郎和织女需要考虑哪些问题呢?
问题一:怎么证明双方的身份?
第一个问题,牛郎一定要确认,收信人是织女,而不是丈母娘王母娘娘。只有织女收到邀约,约会才有可能成功。换个正经的说法,就是牛郎要确认收信人的身份。
从织女的角度看,她也要确认发信人是牛郎,而不是喜欢恶作剧的少年郎,或者是其他的姊妹淘。也就是说,织女要确认发信人的身份。
可是,如果不能面对面,牛郎怎么知道收信的一定是织女;织女又怎么知道发信的一定是牛郎?
问题二:怎么能使消息不泄露?
第二个问题,牛郎一定要确认,这封信的内容王母娘娘看不到。约会的时间、地点一旦外泄,约会恐怕就会节外生枝。或者换个说法,只有牛郎和织女才能够看得到这封信的内容,其他人都不能阅读这封信。
问题是,如果织女能够看得到这封信,为什么王母娘娘就一定看不到?无论中间媒介是喜鹊还是流星,王母娘娘可是有遮天的权势,她难道就没有办法看一眼信件的内容吗?
问题三:怎么防止内容被篡改?
更坏的情况是,如果消息不仅泄露了,内容还被篡改了呢?这是牛郎织女要考虑的第三个问题。牛郎怎么才能确保,织女收到的信的内容是七夕鹊桥会,而不是分手宣言;约定的时间是晚七点,而不是早八点;约会的对象是织女,而不是嫦娥?
而织女也一定要确认,收到的信的确是牛郎写的,而且一字不多、一字不拉和一字不差。牛郎怎么做,才能确保信件的内容不被篡改呢?
问题四:怎么确保信件能收到?
事情纵有千般好,可如果织女不能及时收到信,牛郎是会被放鸽子的。这封信能不能在七夕前送到?这是牛郎织女要考虑的第四个问题。
如果是喜鹊传递信件,这个可怜的小东西会不会中途被请去喝茶吃酒,醉醺醺地忘了托付?如果是流星传递信件,织女会不会在七夕前看看流星雨,解读哪一颗流星携带了牛郎的信息?万一夜空忽然像开了万花筒,红的蓝的紫的烟花可劲地绽放,织女只有一双眼睛,可如何是好?
所以,怎么才能保证牛郎发送的信息可以被及时地送达、拆阅?
问题五:怎么防止翻脸不认账?
最后一个问题就是,牛郎一定要确认,织女收到了信,不能抵赖说没收到;织女也一定要确认,牛郎发出了约会邀请,不能抵赖说没发出邀请。
做过的事,说过的话,要有防翻脸、防撕扯机制。有什么办法防止翻脸不认账呢?
所以,你看,我们和附近的朋友打个招呼很容易:走到面前,说句你好;如果有别人,小心翼翼地问,七月初七有空没有?这信息就算是送到了。
可是,一旦我们拉开了距离,打个招呼、送一封信就变成了一件有点复杂的事情。
约会难题有现实意义吗?
在无线电技术发明之前,大部分的信息传递都是在人与人之间进行的,尤其是在熟人之间。人与人之间的信任是解决信息安全传递问题的最关键因素,信息传递的速度和半径也有很大局限。
比如说,在历史战争剧中,我们经常可以看到需要一名勇冠三军的猛将突围搬救兵的情节。作为敌方,只要能劫杀到突围的猛将,信息传递的路径就算是掐死了。
好在无线电技术发明之后,信息传递的办法就彻底改变了。即便是赵云再世,现在也没有七进七出的战争场景了。总体来说,现在的信息传递变得更迅速、更经济、几乎是无处不在了,家书值万金的场景也是一去不复返了。
无论你身在何处,只要你有一部智能手机,你就可以联系到家人和朋友。这时候你会问了,那现在都有手机了,发个微信不就全解决了吗?哪里还有什么信息传递问题?
是的,作为一款即时通信的工具,微信已经帮助我们解决掉很多问题了。那我们上面讨论的牛郎织女约会面临的问题还有现实的意义吗?有的。
因为,牛郎织女送信的障碍不独独横亘在他们之间,它们是信息传递的普遍问题。即使是今天看起来用户得到简单、便捷、便宜、即时的通信背后,依靠的也是复杂的现代信息技术。
现在很大一部分信息流,都是在人与机器之间进行的。无论是淘宝购物,还是银行转账,甚至发送微信,其实都是你在和机器交流。机器同意后,你的信息才有可能传递给另一个机器,或者你期望交流的具体的一个人。
既然,信息安全的问题一直和人类历史相生相伴,那我们该如何解决呢?
如果我们能够把具体的问题抽象出来,简化成易于理解的、方便表达的模型,你就能够知晓这些问题的普遍性,并且能够把它扩展到千变万化的场景里去。
那么,对于上述的这些问题,我们换个角度,换个说法,把它们表述成需求,并且放到信息系统这个虚拟的代码世界里看看,就可以找到这个具有普遍意义的模型了。
需求一:识别身份,确定牛郎就是牛郎
织女收到信,一看落款是牛郎,她就知道这个牛郎应该是孩子他爹,是董永,而不是王小二。你想一想,如果是一台机器,它该怎么解释“牛郎”这两个字。“牛郎”代表的是一个人,还是一群人?是一只蚊子,还是一盏路灯?没有更多的信息,这个机器是没有办法做进一步判断的。
这就是我们要考虑的第一个需求,就是怎样表述身份,使得这个身份可以被准确标识。这也就是所谓的身份识别(Identification),表述的是身份如何呈现和表述,说的是身份的记号。
扩展开来,这里的身份可以是信息的参与者,比如微信账户,也可以是资产的持有者,比如银行账户,网站域名。
需求二:认证身份,验证牛郎就是牛郎
织女收到信,看到落款是牛郎,再细看笔迹,她可能就有八分把握断定这信是孩子他爹写的。之所以还有两分疑问,那是因为对于神通广大的王母娘娘,伪造笔迹算不上是了不起的事情。
机器该怎么办?网络传递的都是二进制代码,你的键盘输入的牛郎和我的键盘输入的牛郎,并没有笔迹的差异。另外,如果只有八分把握,你敢不敢使用手机银行转账?
这就是我们要考虑的第二个需求,就是怎样认证身份,验证信里面所宣称的牛郎就是写信的那个牛郎。这也就是所谓的身份认证(Authentication),是识别和验证身份的过程,也就是验明正身的意思。
需求三:管理特权,授予织女看信权利
这封信为什么会送到织女的手里,而不是王母娘娘的手里?很显然,这封信的收信人是织女,所以喜鹊会把信投递给织女而不是王母娘娘。其实,这也就意味着,织女独享收信、看信的权利,而王母娘娘没有。
机器会怎么办呢?理论上,互联网的每个信息转发节点都有可能截获这封信,看到信的内容,这就破坏了看信者的独享权利。那我们怎么才能把权利授予织女,而排除其他人看信的权利?
这就是我们要考虑的第三个需求,就是怎么管理权限,使得特定的身份有特定的权限。这也就是所谓的授权(Authorization),是指定对资源的访问权限,或者使用特权,说的是权利。
把上面三个需求放在一起,我们就解决了权限管理的基本问题:该怎么标识身份?该怎么验证身份?以及一个身份拥有什么样的权利?
需求四:信息保密,没有权限不能看信
牛郎织女约会的第二个问题是,怎么能使消息不泄露?换个说法,就是怎么保密信息。所谓的信息保密,也就是数据的“机密性”(Confidentiality),指的是数据未经授权,不得访问。授权的对象既包括个人、实体,也包括处理过程。
如果没有授权王母娘娘拆阅信件,即使王母娘娘劫杀了送信的喜鹊,她也不能看到信件的内容。这就是信息保密的需求。
需求五:信息完整,保护内容不被篡改
牛郎织女约会的第三个问题是,怎么防止内容被篡改?换个说法,就是怎么保持信息的完整性。所谓的“完整性”(Integrity),指的是数据未经授权,不得更改。信息的完整性,也意味着信息的准确性,信息不能残缺不全,或者来源不明、去向不明。
如果我们能做到保护信息不被篡改,即使王母娘娘神通广大,可以请喜鹊去喝茶吃酒,她也没有办法改动信件的哪怕一个字、一个标点符号。这就是信息完整的需求。
需求六:信息可用,保持信息获取能力
牛郎织女约会的第四个问题是,怎么确保信件能收到?换个说法,就是怎么保持信息的可用性。所谓的“可用性”(Availability),指的是数据经过授权,可以访问。也就是说,需要的时候,经过授权,可以获取信息,能够获取信息。
如果喜鹊被请去喝茶吃酒,醉醺醺地忘了托付,牛郎的信送不到,织女的信收不到,这就破坏了信息存在的意义。该发送的信息能够及时发送出去,该收到的信息能够及时收到,这就是信息可用的需求。
我们把上面三个需求放在一起,就解决了信息安全的基本问题:信息能够完整地、秘密地传递出去和接收进来。
在这六个需求里面,前三个需求,说的是授权的过程,后三个需求,说的是安全的要素。
哪一个需求最重要?
不知道你有没有疑问,这六个需求里,哪一个需求最重要,该优先考虑呀?这是一个好问题。
信息安全这件事,具有典型的木桶效应,安全不安全是由最短的一块木板决定的。什么意思呢?就是每一个要素、每一个需求实现都不能有明显的弱点。任何一个要素,如果我们没有清清楚楚地落到实处,都会带来一把鼻子一把泪的。
这六个需求就像是六个维度,就像一间屋子的长宽高(三维更便于理解)。如果很长、很宽,但是高度为零,它就没有体积。没有人能住高度为零的屋子,或者高度 10 厘米的屋子。
同样,也没有人能住长度为零或者宽度为零的屋子。一个舒适的屋子,长度、宽度、高度都要合适。这就好比,牛郎和织女约会的例子中,任何一个问题真实发生了,这场约会就会走向失败。
所以,有没有办法可以满足所有的需求呢?这时候,密码学就登场了。
密码学有办法吗?
如果放在 50 年前,这些需求理论上是没有办法完全解决的。但是现在,密码学有好几套体系办法,可以漂亮地解决掉这些问题,满足这些需求。
我们知道,信息安全是一个庞大复杂、涵盖广泛的学科,而密码学只是信息安全技术的一个小门类。也有人说密码学是信息安全的核心技术,我并不反对这样的说法。
虽然密码学只是一个小门类,但是如果你钻进了密码学领域,你就会发现,密码学也是一个大森林,枝枝蔓蔓的有很多技术、规范、协议和体系。
密码学最基础的分支有三个,第一个是单向散列函数,第二个是对称密码技术,第三个是非对称密码技术。这三项基础技术的组合运用,诞生出了丰富的安全协议和体系,比如说数字证书、安全传输、区块链、数字货币等。
回到我们上面的约会问题,如果粗陋地来看,对称密码技术可以通过加密、解密,解决“机密性”的问题;单向散列函数,可以解决“完整性”问题;非对称密码技术可以解决授权和认证的问题;通过我们对这三项基础技术的综合运用,就可以提高系统的“可用性”。
那这些密码学技术都是什么呀?是怎么解决这些问题的呀?这就是我们整个专栏要关注的重点,后面我们会接着拆解这些密码学概念和技术,开始进入密码学的细节。你准备好了吗?
Take Away(今日收获)
英文中,有一个词汇叫“Take Away”,指的是一个活动结束后,比如会议或者讨论,大家要记住的关键事实、观点或者想法。用在每篇文章的结尾,我觉得是一个很贴切的表述。但是,没有找到合适的中文翻译,先使用英文词汇。
今天,通过牛郎织女这个小例子,我们探讨了牛郎织女约会信息传递的五个障碍:双方身份难以证明、消息会泄露、内容会被篡改、信件无法及时送到以及存在双方翻脸不认账的风险。
虽然在现代社会,传递一个消息已经不是一件困难的事,但这五个障碍仍是信息安全里的重要议题,我们也由此总结了信息安全的六个基本需求:
身份识别、身份认证和授权。这三个需求解决了权限管理的基本问题:该怎么标识身份?该怎么验证身份?以及一个身份拥有什么样的权利?
信息的机密性、完整性、可用性。这三个需求解决了信息安全的基本问题:信息怎么能够完整地、秘密地传递出去、接收进来?
最后,通过今天这一讲,希望你:
理解信息安全的基本问题和基本需求;
建立起来均衡考量信息安全基本需求的意识;
明确学会用好密码学的意义。