在与Roger Needham合著的一篇论文中,Ross Anderson创造了短语“给撒旦的计算机编程”,用于描述计算机安全工程师面临的问题。想到Ross,我的脑海里就浮现出这幅图景,自那时起我也开始使用这个短语。
给计算机编程是直接的:不断地排除问题,直至计算机完成了需要完成的任务。大型应用程序与操作系统更复杂一些,但方法基本相同。编写可靠的计算机程序更难,因为程序需要在面对随机错误和失误时仍能有效工作:墨菲的计算机。关于可靠的软件设计,已经有大量的研究,也有很多关键业务软件应用程序在设计上可以抵抗墨菲定律。
编写安全(secure)的计算机程序完全是另一码事。安全不仅涉及让确定的事情有效进行,也不仅是处理随机错误,更要面对的情况是,智能的恶意对手总是一再试图在最糟糕的时间以最糟糕的方式让事情无法进行。这确实是在为撒旦的计算机编程。
安全工程不同于任何其他类型的编程。这是我在专著Secrets and Lies、月刊Crypto-Gram和我撰写的其他作品中一再强调的观点。这也是Ross在本书每一章中强调的一点。这也是为什么在你完成安全工程方面的工作,或在思考做安全工程方面的工作时需要阅读本书的原因。这是第一本,也是唯一一本关于端对端现代安全设计与工程的书籍。
本书的撰写可谓恰逢其时。可将Internet的历史划分为三个阶段。第一阶段集中于大型机和终端,那时计算机昂贵稀缺;第二阶段大概从1992年到现在,集中于个人计算机、浏览器以及大型应用程序;第三阶段从现在开始,我们将看到目前在专用网络、独立的、非计算化环境中的所有类型设备连接在一起。到2003年,连接到Internet中的移动电话要多于计算机。我们将在几年内看到,世界上很多电冰箱、心脏监控器、公交车票与火车票配售机、防盗警铃和电子仪表都将使用IP进行通信。个人计算机在Internet中的地位将逐渐弱化。
安全工程,特别是在Internet历史的第三阶段的大环境下,需要采用不同的思考方式。你不仅需要设计事物的正常运作流程,还要考虑哪些因素会导致异常。必须假设系统内部存在智能的、恶意的对手(回想一下撒旦的计算机),对手在不断寻找迂回绕行的新途径。你必须考虑可能导致系统失败的各种因素,其中大部分都与设计本身无关。你必须对每件事情都由表及里、自上而下、从左到右地进行全方位衡量,你必须像外星人一样进行思考。
就像最近科幻小说编辑John W. Campbell所说的:“外星人和人类一样也会思考,但与人类的思考方式不同”,计算机安全与此很类似。Ross是少数可像外星人一样思考问题的人之一,并可将这种思考方式向普通人解释清楚。请享受学习的乐趣吧。
Bruce Schneier