Bruce Schneier 的《应用密码学》(Applied Cryptography)是我的密码学启蒙书。我上本科的时候读过一遍影印版。读博士的时候导师说他有本出版社请他写书评时送的,听说我喜欢就送我了,所以又读了一遍。过了几年 Bruce Schneier 又写了一本书叫 Secrets & Lies。即使你没有兴趣看这本书,它的前言也值得一读。这里我只翻译一部分:

七年前我写了另一本书:《应用密码学》。我在其中描绘了一个数学的乌托邦:可以永远保守秘密的算法,以及能安全可靠地执行无监管的赌博、抗检测的认证、匿名货币等美妙的电子化交互的协议。在我眼中,密码学是带来平等的伟大技术;任何有廉价计算机的人都能拥有与最强大的政府同样的安全。在两年后写此书第二版时,我甚至说「仅靠法律保护自己是不够的,我们还需要靠数学保护自己。」

然而我错了。密码学做不到以上的任何一点。

这并不是因为 1994 年以后密码学变弱了;也不是因为书中的技术内容不再正确。而是因为密码学不存在于真空中。

密码学是数学的一个分支。和数学的其它部分一样,它是关于数字、等式、逻辑的。而对于你我来说在生活中能感受到的安全是关于人的:人知道的事、人之间的关系、人和机器的关系。信息安全是关于计算机的:复杂、不稳定、有缺陷的计算机。

数学是完美的;现实是主观的。数学是确定的;计算机是易怒的。数学是有逻辑的;人是不确定、易变和难以理解的。

《应用密码学》的错误在于我没有对上下文做任何讨论。我把密码学当作答案 ™ 来讲述。这是很幼稚的。

[…] 一个同事曾和我说,世界上充满了《应用密码学》的读者设计的糟糕的安全系统。[…]

几年前我听过一句话,在这里稍微改动一下:如果你认为技术能解决安全问题,那么你既不懂安全也不懂技术。

有很多关于区块链的文章都说「区块链解决的核心问题是信任问题」,但是我没有看到有人回答了关键的问题:到底什么是信任?什么是所谓「信任问题」,它存不存在?什么算是「解决了信任问题」?事实上如果在 Google 上搜一下这句话,会找到大量的复制粘贴和人云亦云。Brice Schneier 书里那句话改一改也是适用的,如果有人认为技术能解决信任问题,那么他恐怕既不懂信任也不懂技术。

Ken Thompson 1984 年的图灵奖演讲 Reflections on Trusting Trust 很好地从技术的角度解释了信任的本质。读者不妨去看看原文,或者也可以参考我在 XcodeGhost 出现时写的一篇简介。细节在本文就不再复述了,简单地说,他演示了一个不仅通过源码分析无法发现,通过反编译二进制码分析也无法发现的攻击。他在演讲中说「关于一个程序里没有木马的保证到底有多可信呢?或许更重要的是信任开发软件的人。」他展示了除非你使用的整个软硬件栈都是自己制造和开发的,就得信任其他人。

信任是社会存在和运转的基础。我们把钱存在银行,相信需要的时候一定能从取款机取出来;我们每天上班,信任路上的司机不会开车撞我们;乘飞机旅行,信任飞行员技术够好不会坠机,信任其他旅客不是恐怖分子,也信任飞机制造商没有埋下安全隐患。我们经常会在美国电影上看到一个人对最亲密的人说「I trust you with my life.」,然而看起来我们其实每天都在以生命来信任陌生人。事实上我们信任的不是某个个体,而是整个社会系统。这个系统通过道德、价值观、经济体系、法律定义了规则,并让违反规则的人受到惩罚。这个系统保证了大部分司机会尽可能安全驾驶,机场会检查登机旅客,航空公司会严格地审查和培训飞行员。

技术在信任和安全方面扮演的角色就好像门锁。大部分人不偷不抢是因为他们想做被他人接受的社会成员,尽量不做不道德的事;剩下的人中 99% 以上的人是因为担心受到法律的制裁;只有极少数的人是因为打不开锁。所以你从不会听说一个城市通过投资制造更好的锁来降低犯罪率。假设给我两个选择,要么是生活在北京,但是没有门锁,要么生活在一个没有法律、道德约束的地方,但是可以装最好的锁。我一定会选择前者,我多半会丢失一些东西(取决于住什么小区),但如果选择后者肯定会没命。

好的技术是对社会的安全、信任机制的补充,它无法替代这些机制,更不能破坏这些机制。到目前为止,区块链已经实现的可以放在阳光下说的实际应用价值约等于零。当很多区块链公司在苦苦寻找应用场景来讲故事的时候,加密货币倒是成了 Silk Road、Dream Market 等黑产市场的主要交易媒介,最近几年知名的多次 ransomware 攻击也都是让受害者以比特币支付赎金。对于需要逃脱现有社会机制可能带来的惩罚和后果的人来说,加密货币发挥着很大作用,或者说是它真正完成货币功能的最主要场景,所以有很多人直接用黑产交易量来估算加密货币的合理市值。加密货币对现有社会机制的影响,以及它为什么群体带来最多的便利和价值,是值得更多思考的问题。

安全和信任是一个链条,它的强度是由其中最弱的一环决定的。历史上的安全事件几乎没有任何针对密码学算法和协议的攻击,即使是技术上的攻击也大多是针对具体软件实现,更多的是通过欺骗、引诱、胁迫等手段针对人的攻击。当密码被主动交给攻击者的时候,加密算法是用 128 位秘钥还是 2048 位密钥并没有什么差别。2007 年在比利时,有一个人靠个人魅力敲开了银行保险库偷走了接近三千万美元的钻石:他靠经常请大家吃巧克力得到了银行职员的好感和信任。要知道比利时人可不缺巧克力。

电影「猫鼠游戏」(Catch Me If You Can)的真实原型 Frank Abagnale 在 16 岁离家出走后使用过 8 个身份,在很长时间里成功地伪装成各种不同职业人士,包括民航飞行员、医生、政府官员、律师。在最终被抓住后他加入了 FBI 成为反欺诈专家。有一次他在 Google 做讲座,台下有人问他现在警察和 FBI 有很先进的监控和侦破技术,罪犯还有没有可能像他当年那样成功。他的回答是现在唾手可得的信息只会让那些事情简单百倍。有无数的案例说明在安全和信任的链条中,人的因素是最薄弱的一环,而人的问题往往不是靠技术能解决的。

可能上面的欺诈案例离区块链有点远,我说件很多人都熟悉的事。以太坊(Ethereum)上最早有很大影响的智能合约叫 The DAO (The Decentialized Automomous Organizaiton)。「The」是官方名称的一部分,这让我想起 Facebook 早期的名称「TheFacebook」。The DAO 的使命是:

To blaze a new path in business organization for the betterment of its members, existing simultaneously nowhere and everywhere and operating solely with the steadfast iron will of unstoppable code.

Unstoppable code 的加粗是原文里的。我觉得认为 unstoppable code 是好事的人多半比较缺乏人生经验,有点 too simple。The DAO 可以理解为一个分布式的投资机构,大家都能把钱(用以太币的形式)投进去,以投票的方式决定投资到哪些项目。它不靠人为管理,一切都靠程序来执行。The DAO 上线以后成为了有史以来最大的众筹项目,一万一千个投资者投入了相当于一亿五千万美元的以太币,占当时以太币总量的 14%。和任何一个有些复杂的程序一样,The DAO 的智能合约代码是有漏洞的(换个说法,是有一些大部分人没注意到的功能)。于是有攻击者利用这个漏洞/功能从 The DAO 里累计转走了价值 5000 万美元的以太币。因为智能合约的代码在两周内无法修改,所以没有人能阻止他,毕竟要是能 stop 就不能叫 unstoppable code 了嘛。当时有人在 Reddit 上发了一幅漫画:

一幅 Reddit 上的漫画

一幅 Reddit 上的漫画

攻击者第二天在 Pastebin 上发布了一个声明:

我仔细阅读了 The Dao 的代码,在发现这个有利可图的功能后,决定参与进来。我使用了这个功能并合理地得到了 3,641,694 个以太币。

智能合约的支持者认为它的优点在于代码就是法律(code is law),不需要也不应该由人来诠释,那么有人通过代码定义的规则获得了回报确实是合理的。本来 The DAO 只是以太坊上的一个应用,这件事和以太坊基金会(Ethereum Foundation)没有太大关系。然而因为以太坊社区的很多大佬和核心开发者都投了很多以太币在 The DAO 里,以太坊基金会决定要挽回在 The DAO 损失的以太币。唉?不是说区块链上的数据和交易都是不可能改的吗?不改数据,可以改对数据的解释啊,重新定义一下以太坊就好了嘛。以太坊基金会因为 The DAO 改变了整个以太坊的实现,对以太坊区块链进行了硬分叉。以太坊区块链出现了两个分支:一个叫 ETH,在这个分支上对 The DAO 的攻击相当于没发生;另一条叫 ETH Classic,是原来没经过修改的分支。虽然对外说这个决定得到了社区共识,但当时以太坊基金会并没有讨论和解决分歧的官方渠道和投票机制。不要说算力可以自由选择投入到哪个分支,是用算力投票。第一,影响力决定算力。在分叉已经发生后,参与者考虑的是哪个分支最有前途、会让自己在未来得到最高回报。在以太坊社区里又有什么是比得到以太坊基金会的背书更有说服力的呢?要是美联储今天出来说我们要在一个新的区块链上发行一个新的货币,其它的加密货币我们都不承认,我想大部分比特币和以太坊的矿工也会马上改弦易辙的吧。第二,多数算力集中在少数人手里,这是规模经济不可避免的结果,在上一篇文章里已经说过就不赘述了。社会结构里权力和影响力的集中并不会因为有区块链而有什么改变。本来我写了一小段说明民主不是简单的多数人说了算或者多数算力说了算,但是这个问题太深,不适合夹在本文中间,所以删掉了。

绝对不能改的东西在世界上很少有,在数字世界更是不存在,主要还是看谁想改。代码就是法律,只是对一部分人来说在代码面前只有其他人是平等的,如果真想改,不开人大也能改。此外又有谁能证明对 The DAO 的攻击不是写智能合约的人故意留下漏洞,监守自盗呢?毕竟在代码里埋下别人难以发现的漏洞(功能)是很容易的,每年都有这样的编程比赛。区块链到底让谁更能信任谁了呢?

技术工具是有价值的,就和锁是有价值的一样,但是人和社会的问题大多是无法用技术解决的。相反,技术的发展往往会放大这些问题。区块链是一个分布式时间戳服务,它解决的问题是在一定条件下让参与者对数据项的顺序以大概率达成一致,但对这些数据的内容和性质并不提供内在保证。区块链不解决信任问题,更不是下一代互联网。如果你的应用场景需要一个分布式时间戳服务,并且没有我上一篇文章指出的那些问题,区块链就可能对你有价值。如果不需要,它对你就没有价值。我听说过的区块链应用都有其它更经济、更高效,并且通常更可靠的实现方式。大多数时候和区块链拉上关系只是为了靠近热点而已,毕竟在当下的环境只靠流行词和吹牛也能让一个人或一家公司走得很远。当然,我也不能因为自己没有看到就说不存在,但是对于一个已经火了那么久、吸引了那么多资本和创业者的有价值的技术来说,应该不至于还没出现有很多人经常在用的产品。

我在 Twitter 上看到过一个决策图,应该对在考虑是否需要区块链的人很有帮助:

Blockchain Decision Diagram

Blockchain Decision Diagram