2.3 散列函数
散列算法特别的地方在于它是一种单向算法,用户可以通过Hash算法对目标信息生成一段特定长度的唯一的Hash值,却不能通过这个Hash值重新获得目标信息。因此Hash算法常用于不可还原的密码存储、信息完整性校验等。常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA。MD5和SHA-1是最常见的Hash算法。MD5是由国际著名密码学家、麻省理工学院的Ronald Rivest教授于1991年设计的;SHA-1背后更是有美国国家安全局的背景。
2.3.1 MD5散列算法
MD5为计算机安全领域曾经广泛使用的一种散列函数,用以提供消息的完整性保护。对MD5加密算法的简要叙述是:MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
MD5被广泛用于各种软件的密码认证和密钥识别上。MD5用的是哈希函数,它的典型应用是对一段Message产生fingerprint(指纹),以防止被“篡改”。如果再有一个第三方的认证机构,用MD5还可以防止文件作者的“抵赖”,这就是所谓的数字签名应用。MD5还广泛用于操作系统的登录认证上,如UNIX、各类BSD系统登录密码、数字签名等诸多方。
MD5哈希算法总体流程如图2-5所示,表示第i个分组,每次的运算都由前一轮的128位结果值和第i块512bit值进行运算。
图2-5 MD5哈希算法流程
2.3.2 SHA1散列算法
SHA1是和MD5一样流行的消息摘要算法。SHA加密算法模仿MD4加密算法。SHA1设计为和数字签名算法DSA一起使用。
SHA1主要适用于数字签名标准里面定义的数字签名算法。对于长度小于264位的消息,SHA1会产生一个160位的消息摘要。当接收到消息的时候,这个消息摘要可以用来验证数据的完整性。在传输的过程中,数据很可能会发生变化,那么这时候就会产生不同的消息摘要。SHA1不可以从消息摘要中复原信息,而两个不同的消息不会产生同样的消息摘要。这样,SHA1就可以验证数据的完整性。所以,SHA1是为了保证文件完整性的技术。
SHA1对于每个明文分组的摘要生成过程如下。
(1)将512位的明文分组划分为16个子明文分组,每个子明文分组为32位。
(2)申请5个32位的链接变量,记为A、B、C、D、E。
(3)16份子明文分组扩展为80份。
(4)80份子明文分组进行4轮运算。
(5)链接变量与初始链接变量进行求和运算。
(6)链接变量作为下一个明文分组的输入重复进行以上操作。
(7)最后,5个链接变量里面的数据就是SHA1摘要。
图2-6为SHA1哈希算法流程图。
图2-6 SHA1哈希算法流程
SHA1哈希算法可以采用不超过264位的数据输入,并产生一个160位的摘要。输入被划分为512位的块,并单独处理。160位缓冲器用来保存散列函数的中间和最后结果。缓冲器可以由5个32位寄存器(A、B、C、D和E)来表示。SHA1是一种比MD5的安全性强的算法,理论上,凡是采取“消息摘要”方式的数字验证算法都是有“碰撞”的——也就是两个不同的东西算出的消息摘要相同。但是安全性高的算法要找到指定数据的“碰撞”很困难,而利用公式来计算“碰撞”就更困难。
SHA1与MD5的差异主要在于:SHA1对任意长度明文的预处理和MD5的过程是一样的,即预处理完后的明文长度是512位的整数倍,但是有一点不同,那就是SHA1的原始报文长度不能超过264,然后SHA1生成160位的报文摘要。SHA1算法简单而且紧凑,容易在计算机上实现。SHA1与MD5的比较如表2-1所示。
表2-1 SHA1与MD5的比较
在安全性方面,SHA1所产生的摘要比MD5长32位。若两种散列函数在结构上没有任何问题的话,SHA1比MD5更安全。
在速度方面,两种方法都是主要考虑以32位处理器为基础的系统结构。但SHA1的运算步骤比MD5多了16步,而且SHA1记录单元的长度比MD5多了32位。因此若是以硬件来实现SHA1,其速度大约比MD5慢了25%。
在简易性方面,两种方法都相当简单,在实现上不需要很复杂的程序或是大量存储空间。然而总体上来讲,SHA1对每一步骤的操作描述比MD5简单。