首先,程序员原本都没有受过安全训练或者是这方面的经历。在那个时候,学校也没有开设安全方面的课程,大多的程序员在从大学毕业以后就开始从事开发的工作了,这和我一样。但是我在大学的时候,给学校做过安全方面的东西,然后又给一个TV工作站做过,最后才到现在雇佣我的电脑公司工作。那时,是给工程师和物理学者教授FORTRAN的年代,调制解调器都还没有发明出来。事实上,我还没有一个计算机科学的学位证书,因为那时还不提供这个方面的证书。
编写安全程序的第二个困难就是一个程序有可能要依赖1,000,000左右的代码――而大多的代码是开发者们不写的甚至连看都不看的代码。当我第一次写机器语言的程序的时候(在十多年之后才产生C语言),所有的代码都是由我自己完成的,在那时并不是一件很困难的事情。我写的第一台计算机程序是
的1401(PDP-6是我写的第三个或第四个计算机程序)。
如今,在普通网络上和一些虚拟专用网络上都没有足够的安全环境;同样,我们也和一些非常复杂的任务打交道,使用的开发平台对开发者99%隐藏了它的底层程序。所以这就给需要开发安全代码的开发者们带来很大的困难。编译器中的Bugs,它能够挫败最仔细的安全计划,所以,它给开发任务带来了更多的困难。例如,在2003年初的时候,我写了一篇关于GCC 和其它编译器的优化程序方法,可以从内存中击败仔细的程序员想要保护密码的计划。
给安全应用方面的软件开发人员带来的第三个方面的困难就是病毒程序只需要破坏安全程序的一个方面就可以了。当你从这方面考虑的话,你就可以理解为什么这么多的安全专家表明不能够创建一个完全安全的程序或者操作系统。
为了达到一个好的安全保障,你必须从一开始就考虑设计安全方面的问题;但是即使是在现在,还有很多人到后期才考虑安全问题,一些安全特征在将近程序完成的时候才显现出来。
很少有开发人员或者公司愿意把精力全部投放在创建一个真正安全的程序。创建完全安全程序的代价是无限的,所以总归是应该有折中的办法产生。
软件安全性是一个新兴的话题。我第一次看到Byte,是1985年的一本书软件确认验证测试和文档(Software Validation
Verification Testing and Documentation)。当今天重看这本书的时候,我惊讶地发现,这本书居然没有一个章节、一个段落或者一小句话包含了“security”这个词语。
现在,在我的书架上有一打书名都是关于“软件安全”类的书籍;其中的一些还是非常不错的。其中有一本书,可以让那些认为自己的软件(程序)是安全的人们感到一震,作者是Ross Anderson,书名叫做安全工程:创建可靠分布式系统的向导(Security Engineering: A Guide to Building Dependable
Distributed Systems)这本书主要的贡献就是Mr. Anderson呈现了关于国际银行业、ATM、智能卡所可能存在的弱点,还有一种“Tempest
virus”病毒,它能够造成计算机在不经意之间就无线地传播其中的数据。(请注意:这不是一本编代码的书;它考虑了最坏情况发生时的状况。)
安全是一个过程,如果一个开发者在程序中的任意一个部分有偷懒的地方,那么它的漏洞就会在整个项目中显现出来。所以,在你遇到以上三个方面的安全困难挑战的时候,一定要时刻牢记这句话。