消息摘要算法概述
1.定义:Hash算法是密码学算法非常重要的一个分支,它用于生成数据的“指纹”,具有不可逆性。哈希(Hash)算法也被称为消息摘要算法、散列算法或杂凑算法。
2.特点:
(1)单向性:无法通过哈希值反推原始数据。
(2)抗碰撞性:不同的输入数据产生相同的哈希值的概率极低。
(3)雪崩效应:输入数据的微小改变会导致哈希值的巨大变化。
(4)数据压缩功能:能将任意长度的输入转化成固定长度的输出。
(5)算法公开,不需要密钥。
3.安全杂凑函数的一般结构
安全杂凑函数的一般的结构是一种迭代结构杂凑函数,由Merkle提出,
包括SHA-1等在内的目前所使用的大多数杂凑函数都采用这种结构。杂凑函数接收一个输入报文M ,并将其分为t个固定长度的分组。该杂凑算法重复使用一个压缩函数f,压缩函数f有两个输入:一个是前一阶段n比特输出;另一个来源于消息的r比特分组,并产生一个n比特的输出。
4.填充方式
在生成杂凑值之前对输入消息进行分组时,如果最后一块报文不足r比特,就要进行填充。填充的方法是:在最后一块分组后进行填充,保证填充后的分组的最后64比特为整个消息的总长度(以比特为单位),然后在中间进行填充。填充有两种方式:一种是全部填充0;另一种是填充比特的最高位为1,其余均为0。
5.杂凑函数的应用
- 数字签名:消息摘要是通过单向函数将需加密的任意长度明文“摘要”成一串固定长度的密文。不同的明文摘要成密文,其结果总是不同的;而同样的明文,其摘要必定一致。因此,摘要成为明文是否完整的“指纹”。由于消息摘要通常比消息本身小得多,因此对消息摘要进行数字签名在处理上比直接对消息本身进行数字签名高效得多,所以数字签名通常都是对消息摘要进行操作。基于杂凑的数字签名有以下有点:①对Hash值进行签名可以取得更短的签名。②计算上更快。③更容易管理签名。签名集中在一个分组中,不会形成多个分组的签名。
- 生成程序或文档的“数字指纹”:杂凑函数可以将任意长度的输入变换为固定长度的输出,不同的输入对应着不同的输出,因此,可以基于杂凑函数变换得到程序或文档的杂凑值输出,即“数字指纹”。将其与放在安全地方的原有“指纹”进行比对,可以发现病毒或入侵者对程序或文档的修改。即用杂凑函数生成数据的杂凑值,并与保存的数值进行比较,如果相等,说明数据是完整的,否则,表明数据已被篡改过。这是为了保证数据的完整性,实现消息认证,保证消息不被未经授权地非法修改。
(3). 用于安全存储口令 :如果基于杂凑函数生成口令的杂凑值,然后在系统中保存用户的ID及其口令(Password)的杂凑值,而不是口令本身,则有助于改善系统的安全性。因为此时系统保存的是口令的杂凑值,当用户进入系统时要求输入口令,系统重新计算用户输入口令的杂凑值并与系统中保存的数值相比较,当两者相等时,说明用户的口令是正确的,允许用户进入系统,否则将被系统拒绝。
(4)一致性验证:从网上下载文件,软件,各种资料的时候,有些文件会提供MD5对照信息。利用MD5校验软件来核对下载的文件,可验证下载得到的文件与传送方提供的文件是否相符,防止被"篡改"。
(5)安全访问认证:注册时提交的口令经过Hash计算后存入数据库。验证时提交的口令同样进行Hash计算。一方面避免用户的密码被具有系统管理员权限的用户知道,以保护敏感信息。另一方面即使数据库被不法分子窃取,也很难获知用户的真正口令。
(6)文件秒传:用户文件首次上传到云存储服务时自动计算文件HASH值。下一次用户上传时,在用户客户端计算文件Hash值传到云端进行对比。Hash值相同就省去重复上传。
6.常用的消息摘要算法
(1)MD5
①英文全称为Message-Digest Algorithm5。中文名称为消息摘要算法第五版。
②输入:任何长度的字节流。
输出:128位二进制(常以32位十六进制字符显示)。
③过程:算法以512位为一个分组来处理输入的信息,每一分组又被划分为16个32位子分组,经过了一系列复杂的数据填充、分组循环和换位拼接处理后,算法输出四个32位分组,这四个32位分组级联后生成一个128位(16字节)的散列值。加密过程不需要密钥,加密后的数据无法被解密。只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。
④MD5的破解:MD5有不可逆的特点,但是不可逆,并是代表不能破解。某些MD5破解网站,专门用来查询MD5码,原理是它通过把常用的密码先进行MD5处理,然后将数据存储起来,然后再跟需要查询的MD5结果匹配,这时就有可能通过匹配的MD5值得到明文数据,所以有些简单的MD5码是可能反查到加密前的明文的。
⑤MD5防破解:一个方法是多重加密。所谓多重加密,其实就是把要加密的原文加密成MD5密文,然后再一次将MD5密文加密成MD5密文,多试几次,一般3次以上,上线破解的网站就匹配不上了。记住:匹配不上,不一定就是足够安全哦,只是不容易被轻易破解了(因为第二次要破解的原文是一个32位的16进制的字符串,以此类推),增加了破解的时间成本而已。另一个方法是加盐加密。比如在Java语言中的 Md5Crypt.apr1Crypt(“要加密的密文”, “自定义盐值”), 可以多重使用,自行定义。
- SHA-1
①英文名称:Secure Hash Algorithm 1.中文名称为安全散列算法1,由美国国家安全局设计,是比MD5更安全的一种散列函数。
②输入:任何长度的字节流。
输出:160位二进制(常以40位16进制字符显示)。
处理:输入以512比特数据块为处理单位。
③过程:第一步是添加填充位(一个11和若干个0)。在消息的最后添加适当的填充位使数据位的长度满足长度=448 mod 512(因为有64比特用于长度描述,因此448+64=512满足512比特的整数倍的分组要求)。
第二步是添加长度。一个64比特块,表示原始消息长度,64比特无符号整数(最高有效字节在前)。
第三步是初始化缓冲区(初始向量值)。160位,表示为5个32位的寄存器(A,B,C,D,E)。初始化为常数:A = 67452301、B = EFCDAB89、C = 98BADCFE、D = 10325476、E= C3D2E1F0。
第四步是以512比特数据块为单位处理信息。算法的核心是一个包含四个循环的模块,每个循环由20个处理步骤组成。
第五步是输出。全部L个512个比特数据块处理完毕后,最后输出的就是160比特消息摘要。
④MD5与SHA-1的区别:SHA-1摘要比MD5摘要长32位,SHA-1对暴力破解有更大的防御强度。从设计上SHA-1相对于MD5更不易受密码分析攻击。在相同硬件上,SHA-1的运行速度比MD5慢。
7.Hash函数的实现方式
- 基于公钥密码实现。使用CBC模式基于公钥密码(模数运算)对消息加密,输出最后一个密文分组,销毁密钥。
- 基于对称密码实现。使用CBC模式基于对称密码(分组加密)对消息加密,输出最后一个密文分组,销毁密钥。
- 专门定制设计实现。MD5、SHA-1等。
消息摘要算法存在的问题
1.碰撞概率:
尽管好的摘要算法能够大大降低“碰撞”的可能性,即不同的输入数据生成相同的摘要值的概率应该非常低,但理论上,“碰撞”是肯定存在的。这意味着,有可能存在两个不同的输入消息,它们经过相同的消息摘要算法处理后,产生了相同的摘要值。
2.单向不可逆性:
消息摘要算法的一个重要特性是其单向性,即摘要值无法逆向还原为原始数据。这意味着,一旦原始数据经过算法处理生成了摘要值,就无法通过该摘要值重新获得原始的完整数据。虽然这有助于保护数据的隐私和安全性,但在某些情况下,如数据恢复或验证过程中,也可能带来不便。
3.固定长度输出:
消息摘要算法将输入数据转换为固定长度的摘要值,这在一定程度上限制了算法能够表达的信息量。如果输入数据过长或包含大量冗余信息,那么生成的摘要值可能无法完全反映原始数据的所有特征。
4.算法选择:
在实际应用中,选择合适的消息摘要算法至关重要。不同的算法在安全性、性能、适用性等方面可能存在差异。如果选择了不合适的算法,可能会导致数据的安全性无法得到充分保障。
5.密钥管理:
在某些应用场景中,如数字签名和加密通信等,消息摘要算法需要与密钥结合使用。如果密钥管理不当,如密钥泄露或丢失等,那么即使使用了最安全的消息摘要算法,也无法保证数据的安全性。
6.算法安全性:
随着计算机技术的不断发展,一些曾经被认为是安全的消息摘要算法可能会被破解或绕过。因此,需要定期评估和更新算法的安全性,以确保其能够应对不断变化的安全威胁。
解决办法
1.降低碰撞概率:
(1)采用更安全的算法:使用如SHA-256、SHA-3等更安全的哈希算法,这些算法相比MD5等旧算法具有更低的碰撞概率。
(2)增加摘要长度:增加摘要的长度可以进一步降低碰撞的概率。例如,SHA-256生成的摘要长度为256位,比MD5的128位更长,因此更安全。
2.确保单向不可逆性:
(1)使用经过验证的算法:确保使用的消息摘要算法是已经经过广泛验证和测试的,以确保其单向不可逆性。
(2)避免使用逆向工程工具:不要尝试使用任何逆向工程工具或技术来恢复原始数据,因为理论上这是不可能的。
3.应对固定长度输出:
(1)理解并接受限制:了解消息摘要算法固定长度输出的限制,并在设计系统时考虑这一点。
(2)结合其他技术:如果需要处理大量数据或需要更详细的验证,可以结合使用其他技术,如数字签名、加密等。
3.选择合适的算法:
(1)评估算法的安全性:在选择消息摘要算法时,要评估其安全性、性能和适用性。考虑使用经过广泛验证和接受的算法,如SHA系列。
(2)了解算法的最新进展:由于安全领域的技术发展迅速,新的算法和攻击方法不断涌现。因此,需要定期了解算法的最新进展,以确保所使用的算法仍然是安全的。
4.加强密钥管理:
(1)使用强密码:确保用于消息摘要算法的密钥是强密码,不易被猜测或破解。
(2)定期更换密钥:定期更换密钥可以减少密钥泄露或被盗用的风险。
(3)密钥的安全存储:将密钥存储在安全的位置,确保只有授权人员才能访问。
密码分析方法研究
1.暴力破解法:通过尝试所有可能的输入数据,计算其哈希值,与给定的哈希值进行比较。由于哈希函数的单向性,这种方法在现实中几乎不可行。
2.彩虹表攻击:预先计算大量数据的哈希值并存储成表,当需要破解哈希值时,只需在表中查找即可。然而,随着哈希函数复杂度的提高和计算能力的提升,彩虹表攻击的有效性逐渐降低。
3.碰撞攻击:寻找两个不同的输入数据,使其产生相同的哈希值。碰撞攻击是评估哈希函数安全性的重要指标之一。目前,对于SHA-2系列等较新的哈希函数,尚未发现有效的碰撞攻击方法。
4.量子计算攻击:随着量子计算技术的发展,一些基于量子计算的哈希函数破解方法被提出。这些方法可能对现有的哈希函数构成威胁,需要持续关注和研究。