计算机安全入门(2)
作者:陆麟
转载请征得作者同意.
2005.06.30
书接上文,话说所有的动作都是经过了各种芯片的,因此,芯片内部倘若留有后门,那就大事不妙了。尤其是将软件固化的那些设备,例如不少硬件设备,通常来说
工厂会有一种称为‘工程模式’的特殊模式,在这个模式下,用户的安全设定全部无效。而从这点上来讲,这种‘工程模式’的存在就使得整个设备不可以得到信
任。而操作工程模式的代码则隐藏在芯片内部,或者某个ROM区域。
好吧,多数情况下,芯片级别的后门能直接影响上层应用的情况十分罕见。芯片的特性会要求某个行为的激活条件是固定的,一旦做到了芯片内部,很难修改(不是
说完全无法修改,现在已经有芯片技术,使得芯片的某些电路门逻辑可以动态变化,这基于一个原始的出发点,就是降低IC设计的成本,倘若IC一设计,出来产
品,出问题每次都要重新作光刻等流程来1下,开发周期会延长而开发成本则很庞大)。
现在我们假定已经确信芯片是不存在任何问题,没有缺陷,没有后门。由这些芯片,组成了我们的电脑。
这时候,焦点开始转移了,硬件没有问题,但是很多情况下硬件的拥有者并不希望所有的人都可以操作这些硬件。但是硬件本身无法识别是哪个人来操作硬件。硬件
的职责就是每当有1+1的指令发出后就必须返回2。现在,必须有软件来控制,谁可以发出1+1这条命令。
一般说来,只要一加点,CPU就开始运作,从PC上来讲,称为BIOS的存储器芯片内的软件能在第一时间操作CPU,BIOS的职责在于初始化所有的硬件
设备,使得硬件设备可以进入待命的状态。比如,修改内存控制器的参数,使得内存控制器可以与内存芯片操作需要的参数象符合。BIOS本身完成了初始化后就
负责将1片引导代码加载起来并且将执行权利交给引导代码。BIOS中有很多的选项可以来让用户自行指定从那里去读取这个引导代码。从而,我们可能从
CDROM/硬盘的第一扇区/网卡BOOT-ROM来启动。
启动的目的是要最终加载1片代码,这片代码可以使得用户真正操作这台计算机。用户无法人工对RAM写入任何1个BIT,但是,通过代码,可以做到用户可以
控制RAM中的任何1个BIT。是不是十分神奇阿? 罗嗦的话太多,回到正题。经过1系列的动作,1个OS被加载起来了。
OS会最终负责用户的所有的一切活动。我们的重点,就要讲述OS需要有什么地方的考量,来做到使得计算机尽可能的安全。
安全的第一步是要让计算机能识别谁在操作。这个操作者是否可以操作。
很显然,你直接告诉OS,你是lu0,OS倘若就认为你是lu0,那这个OS的安全设计就完全失败了。最最基本的1点,OS必须和lu0预先约定好某个凭
证,当lu0在OS前出现,并且真的持有这个凭证,这个凭证经过OS的比对,和先前约定的凭证完全一样,这才可以确定确实是lu0来了。
经典的约定是向OS提供1个用户名,以及1个密码。通常情况下,用户名不能是秘密,因为用户名必须在所有的操作前得到确认。这么1来,每个操作都知道现在
是lu0在进行动作,将用户名搞成秘密,会使得OS无法设计下去。但是,密码一定是秘密的,只有OS和lu0双方知道。密码可以是十分复杂的字母和数字,
也可以是指纹,脸型,DNA序列,目前OS设计通常以字母数字为基础,其他的都处于研究中。通常我们认为指纹,脸型,DNA是唯一的,因此,使用这些作为
密码后,不需要输入用户名,但是从目前的计算机实现来看,由于指纹,脸型采集时刻,手可能压重点,压轻点,手和脸的方向旋转点,都会导致采集来的数据与原
来保存的数据有所偏差,所有的算法都必须能容忍一定限度的偏差,不然就没有实用的意义。这么1来,带来的后果就是:可能能保证1000个人的指纹不重复,
但是不能保证10000个人不重复。即使保证10000个人不重复,就无法保证100000人不重复。
密码如此重要,可能值得花费更多的篇幅来讲,但是,我们目前还要将不少其他东西,密码的问题先放1下。
OS的设计,必须能保存用户名和密码,供OS自身判断用户的合法性。
这带来1个问题,OS如果支持多个用户操作,那么如何保证1个用户的密码不被另外1个用户知道呢?
将用户的密码加密是1个很简单的办法,说说加密其实不妥当,因为加密必须要求可以解密。将密码abc变成bcd,算法是在每个字母上加1。这么1来,算法
得到了,加密用得密钥得到了,密码明文也就出现了。通常加密和解密的密钥在一定条件下会在调试器下暴露出来,因此,如果是加密算法得到的密码密文数据加以
保存的话,密码安全性保障是有限度的。数学上有另外1种办法叫做摘要,或者说散列,经过散列后,得到的数据没有任何办法恢复到原来没有散列前的状态。据个
例子MD5。散列这种状况很符合OS安全设计的需要,目前具有正常安全设计的OS都是用的散列值作为用户密码的代表予以保存。
有1点必须预先加以思考,我们可以推断,A的散列=1,并不排除B的散列也可以=1,因此减少散列值的碰撞,是密码保存算法的首要任务。因此,对密码保护
越是强烈的算法,得到的散列值也越长。而且算法本身必须没有漏洞,或者说在当前没有已知的漏洞。
hmm,很糟糕,那么大的篇幅只掀开了安全设计的冰山1角,恐怕连1%都没讲完,大家待续巴。