哈希算法

为什么我们要使用哈希算法?

​ 假如你是某软件公司的研发人员,经过一段时间的奋战,终于开发完成了,现在只需要将项目打成jar包,然后发给客户就可以了,但是现在太晚了,你想今天先回家休息,明天再给客户发过去。

​ 第二天,你正准备将jar相关文件发送给客户,但也许你会有这样的疑问:这个jar文件是我昨晚打的那个jar文件吗?

​ 为什么你会有这样的想法?因为你昨天下班以后,有可能有人黑进你的电脑,将文件更改了,然后重新生成了jar?也可能有人座在你的电脑旁边,将文件也进行修改了呢?也有可能电脑感染了病毒,从而造成文件被修改等等……那你现在需要做的就是,从你昨天打jar包到现在,有没有人或物(统称为主动攻击者Mallory)直接或者间接造成了文件的篡改----即jar文件是否完整

哈希算法_第1张图片

​ 通常情况下,你会想到的办法就是,昨天下班前,将文件备份一下(发到qq或微信或者其他安全的地方),然后今天来上班后,想要确认电脑中文件的完整性的话,就可以将备份的文件与电脑中的文件进行对比,然后看文件是不是完整的

哈希算法_第2张图片

​ 当文件很小的时候,这样的方式还能接受,但是当文件很大、内容很多的时候,这样一一对比就不太现实了,那有什么其他办法可以解决这个问题吗?答案是肯定的,你可以在昨晚打完jar包之后,对这个jar包做一个哈希运算,得到这个文件的哈希值,然后将这个哈希值保存在安全的地方,今天来上班的时候,如果你怕文件被篡改过,那么你就可以用同样的方式对今天的jar文件计算一下哈希值,然后与昨天计算的哈希值进行对比,如果哈希值一致,则证明这个文件没有被篡改过,如果不一致,那么这个文件一定在某个时间被主动攻击者Mallory篡改了

哈希算法_第3张图片

以上就是一个现实生活中使用哈希算法的简单例子,下面来介绍一些哈希算法的相关知识。

一、哈希算法基础知识点

1、解决信息完整性的技术----单向散列函数

单向散列函数既是一个单向函数,又是一个散列函数

①单向函数----正向计算容易,逆向运算困难的函数

即:给定一个数据data,通过该单向散列函数能轻松拿到encData,但是想要从encData反过来拿到data是困难的。(困难不代表不可行:可能现在不可行,以后却可行

②散列函数----一个可以把任意大小的数据,转换成固定长度的数据的函数。计算出的结果叫散列值。

2、一个更实用的单向函数,正向计算会更容易,容易程度就是这个函数的计算性能;一个更实用的单向函数,逆向运算会更困难,困难程度就是这个函数的破解强度。

3、对于固定的数据和散列函数,散列值是确定不会变的。

4、散列值越长,存在相同散列值的概率就越小,发生散列碰撞的可能性就越小。

5、单向散列函数既是一个单向函数,也是一个散列函数。----逆向运算困难,构造碰撞困难

6、数据完整性的*核心就是数据未经授权,不得更改*

7、算法分类–退役算法、遗留算法、现行算法

哈希算法_第4张图片哈希算法_第5张图片哈希算法_第6张图片

以上三张图列举出现实生活中常见的哈希算法,并对其性能、算法信息、安全强度等进行列举。

①密码学安全强度通常使用位来表示,128位的安全强度暂时还是安全的,长期使用的系统可以考虑开始使用256位安全强度的算法。

退役的算法就是那些已经退出了历史舞台的算法,他们的安全强度很弱,一定不能再使用了

遗留算法就是他们存在明显的安全问题,已经不足以支撑现在的安全强度需求了,一定不能再新系统中使用了

④现行的算法就是目前没有明显的安全问题,是我们可以使用的算法***。

⑤对于单项散列函数,目前现行的、流行的算法有:HSA256/SHA384/SHA512

二、典型的单向散列函数

一个典型的单向散列函数,由四个部分组成:数据分组、链接模式、单向压缩函数和终结函数

①数据分组负责把输入数据分割成为压缩函数能够处理的数据块。

②链接模式:负责把下一个数据分组和上一个压缩函数的输出结果结合起来,确保算法的雪崩效应能够延续。

③压缩函数能够接收的数据块的大小是固定的,多一行不行,少一行也不行。对于不是压缩函数能处理的数据块大小的数据,需要进行填充和补齐,从而变成压缩函数可以处理的数据块的大小。----负责算法的单向性要求。

④终结函数:负责整理压缩函数的输出,形成散列值。

哈希算法_第7张图片

当我们需要计算一段数据data的哈希值的时候,我们需要将data进行分组(具体的分组长度依据具体算法而定,如MD5分组长度为512位,64字节,不够分组长度的数据需要进行数据填充和补齐)形成m1、m2、m3……,将每个mi经过压缩函数和链接模式形成e1、e2、e3……,然后将ei通过终结函数组合在一起,形成最后的哈希值

三、单向散列函数常见的攻击方式----长度延展攻击

1、长度延展:假设有两段数据S和M,单向散列函数H,现在需要将S和M拼在一起MSG=S|M或者MSG=M|S,然后用H计算MSG的值。

2、如果将机密信息放在前面,就存在“长度延展攻击”的风险。

但是将机密信息放在后面,则可以避免长度延展攻击

哈希算法_第8张图片

长度延展攻击:

  • 利用已知数据的散列值,计算原数据外加一段延展数据后的散列值。也就是说,如果我们知道了 h(S|M),我们就可以计算 h(S|M|N)。其中,数据 N 就是原数据追加的延展数据。
  • 这个设计 (指 h(S|M)) 就存在“长度延展攻击”的风险。攻击者并不需要知道机密数据,就可以通过一个已知的 URL,构造出一个新的合法的 URL,从而获得不同的授权。

四、单向散列函数的使用场景

1、校验数据完整性

2、数字签名,和非对称秘钥及其算法结合使用;

3、消息认证码,和对称秘钥及其算法结合使用;

4、生成随机数

5、生成对称秘钥

五、单向散列函数校验数据完整性的步骤

输入:

​ 1、数据D

​ 2、原始数据的散列值H

​ 3、计算散列值使用的散列函数

输出:

​ 数据D是不是完整的?

运算:

​ 1、使用散列函数计算数据D的散列值H’;

​ 2、对比数据的散列值H和计算获得的散列值,如果两个散列值相同,则数据D是完整的;否则,数据D是修改过的数据。

六、注意事项

1、一个应用程序,至少支持两种单向函数,当一种出现问题时,另外一种可以替补

2、一般而言,应该选用现行的、流行的算法,现行推荐的算法,保证了算法的安全性,流行的算法,成熟的实现会考虑实现优化,包括CPU扩展指令的支持。

3、 MD2/MD5/SHA-0/SHA-1/SHA-256/SHA-512长度延展攻击都是完全有效的;

SHA-224/SHA-384长度延展攻击虽然不是完全有效,但是算法的安全级别显著降低了;

SHA-512/224、SHA-512/256、SHA-3长度延展攻击是完全没有效果的。

算法,成熟的实现会考虑实现优化,包括CPU扩展指令的支持。

3、 MD2/MD5/SHA-0/SHA-1/SHA-256/SHA-512长度延展攻击都是完全有效的;

SHA-224/SHA-384长度延展攻击虽然不是完全有效,但是算法的安全级别显著降低了;

SHA-512/224、SHA-512/256、SHA-3长度延展攻击是完全没有效果的。

更多内容可参考:https://blog.csdn.net/yangxingpa/article/details/82632808

你可能感兴趣的:(算法相关)