第九十章 红与黑的碰撞·迷雾 10

  借助链接的背景知识外加逆鳞的讲解,邹道对加密算法和MD5有了一个大体的认识:MD5算法可简述为“以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值”。严格来说,MD5不能算是加密算法,只能说是摘要算法。在MD5算法中,首先需要对信息进行填充,使其字节长度对512求余的结果等于448。因此,信息的字节长度(BitsLength)将被扩展至N*512+448,即N*64+56个字节(Bytes),N为一个正整数。填充的方法如是在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,最终的信息字节长度=N*512+448+64=N+1*512,即长度恰好是512的整数倍。这样做的原因是为满足后面处理中对信息长度的要求。
  邹道所看到的那个文本“MD5doc=37b8c2c1093dd0fec281a9d9ac840513”,就是MD5在实际操作中的典型应用,即对一段信息(Message)产生信息摘要(Message-Digest),以防止被篡改。
  上述文本这就是doc文件的数字签名。MD5将整个文件当作一个大文本信息,通过其不可逆的字符串变换算法,产生了这个唯一的MD5信息摘要。
  逆鳞用“指纹”打比方向邹道简要描述了MD5工作过程:地球上任何人都有自己独一无二的指纹,这常常成为司法机关鉴别罪犯身份最值得信赖的方法;与之类似,MD5就可以为任何文件(不管其大小、格式、数量)产生一个同样独一无二的“数字指纹”,每个文件的MD5值是不同的,如果任何人对文件做了任何改动,其MD5值也就是对应的“数字指纹”都会发生变化。比如下载服务器针对一个文件预先提供一个MD5值,用户下载完该文件后,用我这个算法重新计算下载文件的MD5值,通过比较这两个值是否相同,就能判断下载的文件是否出错,或者说下载的文件是否被篡改了。
  逆鳞说到这,还补充了两点,某些软件下载站点的某软件信息中经常可以看到其MD5值,它的作用就在于我们可以在下载该软件后,对下载回来的文件用专门的软件(如WindowsMD5Check等)做一次MD5校验,以确保我们获得的文件与该站点提供的文件为同一文件。
  另外,除了校验和防篡改,MD5还广泛用于操作系统的登陆认证上,如Unix、各类BSD系统登录密码、数字签名等诸多方面。如在Unix系统中用户的密码是以MD5(或其它类似的算法)经Hash运算后存储在文件系统中。当用户登录的时候,系统把用户输入的密码进行MD5Hash运算,然后再去和保存在文件系统中的MD5值进行比较,进而确定输入的密码是否正确。通过这样的步骤,系统在并不知道用户密码的明码的情况下就可以确定用户登录系统的合法性。这可以避免用户的密码被具有系统管理员权限的用户知道。MD5将任意长度的“字节串”映射为一个128bit的大整数,并且是通过该128bit反推原始字符串是困难的,换句话说就是,即使你看到源程序和算法描述,也无法将一个MD5的值变换回原始的字符串,从数学原理上说,是因为原始的字符串有无穷多个,这有点象不存在反函数的数学函数。所以,要遇到了md5密码的问题,比较好的办法是:用这个系统中的md5()函数重新设一个密码,如admin,把生成的一串密码的Hash值覆盖原来的Hash值就行了。