密码学Hash函数

定义:

  Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h = H(M)。

  称M是h的原像。因为H是多对一的映射,所以对于任意给定的Hash值h,对应有多个原像。如果满足x≠y且H(x)=H(y),则称为碰撞

应用:

  用于验证数据的完整性,即判断数据是否被篡改过。

密码学Hash函数的定义

  在安全应用中使用的Hash函数。

密码学Hash函数的应用:

  1、消息认证

  Hash码能够通过如下不同方法用于提供消息认证

    

    a) 使用对称密码E加密消息和Hash码,由于只有A和B共享密钥K,所以消息必然发自A处,且可通过验证Hash码证明数据在传输过程中未被更改。

    b) 使用对称密码只对Hash码加密。由于明文无需加密性的应用,这种方案大大减少了加密操作的负担。

    c) 不使用加密算法,仅使用Hash函数实现消息验证。该方案中,通信双方共享相同的秘密值S,发送方A将消息M和秘密值S串联后计算其Hash值,并将得到的Hash值附在消息M后发送。因为接收方B同时掌握S值,所以能够重新计算该Hash值进行验证。

    d) 在方案c的基础上将整个消息和Hash值加密,以提供保密性。

  处于成本和速度方面的考虑,人们越来越对那些不包含加密函数的方法感兴趣,因此b和c方案更受青睐,不过如果对整个消息有加密型要求,则a和d仍具有实际意义。

  实际应用中,消息认证通常使用消息认证码(MAC)实现。MAC函数将通信双方共享的密钥和数据块作为输入,产生Hash值作为MAC码,然后将MAC码和受保护的消息一起传递或存储。需要检查消息的完整性时,使用MAC函数对消息重新计算,并将计算结果与存储的MAC码对比。MAC提供安全保护,用于抵抗不知道密钥的攻击者的攻击。在实现中,往往使用比加密算法效率更高的特殊设计的MAC函数。

  2、数字签名

  数字签名的应用比消息认证更加广泛。主要有如下两种方案:

  

    a) 使用发送方的私钥利用公钥密码算法对Hash码进行加密。这种方法也可提供认证;由于只有发送方可以产生加密后的Hash码,所以这种方法也提供了数字签名。

    b) 若既希望保证保密性又希望有数字签名,则先用发送方的私钥对Hash码加密,再用对称密码中的密钥对象消息和公钥算法加密结果进行加密,这种技术比较常用。

  3、其他应用

  对于Hash函数,通常还被用于产生单向口令文件。在操作系统中,存储口令的Hash值而不是口令本身,当用户输入口令时,操作系统将比对输入口令的Hash值和存储在口令文件中的Hash值来进行用户验证。

  Hash函数还能用于入侵检测和病毒检测。将每个文件的Hash值H(F)存储在安全系统中(如CD-R),随后就能通过重新计算H(F)来判断文件是否被修改过。入侵者只能够改变F,而不能改变H(F)

  密码学Hash函数能够用于构建随机函数PRF或用作伪随机数发生器。基于Hash函数的PRF可用于对称密码中的密钥产生。

密码学Hash函数的安全性需求

  

  弱Hash函数:只满足以上前五个要求的Hash函数。

  强Hash函数:满足以上前六个要求的Hash函数。

  强Hash函数能够保证免受以下攻击:假设Bob写一条借据消息并发送给Alice,Alice在借据上签名认可。Bob如果能找到两条消息具有同样的Hash值,其中一个借据消息要求Alice归还金额较小,另一个金额很大,那么让Alice签下第一个小额借据后,Bob就能声称第二个借据是真实的(将Alice在第一个借据的签名附到第二个借据中)。

  下图展示了抗原像攻击、抗弱碰撞攻击和抗强碰撞攻击三者之间的关系

  

  在传统观念中并没有把伪随机性作为密码学Hash函数的安全性需求,但在实际应用中或多或少有所要求。密码学Hash函数通常用于密钥产生、伪随机数发生器以及消息完整性应用,上述三个应用都要求Hash函数的输出是随机的。

  

对Hash函数的攻击

  1、穷举攻击

  a) 原像攻击和第二原像攻击

  攻击者对给定的Hash值h,试图找到满足H(y) = h的y。穷举攻击的方法是随机选择y,尝试计算其Hash值知道碰撞出现。对于m位的Hash值,穷举的规模大约是2m,对于攻击者平均尝试次数为2m-1,才能找到一个满足H(y)=h的y值。

  b) 碰撞攻击

  对于碰撞攻击,攻击者试图找到两个消息或数据块x和y,满足H(x)=H(y),与原像攻击和第二原像攻击相比,其穷举的规模相对更小一些,这也通过数学上的生日悖论得到印证。本质上,如果我们在均匀分布的0到N-1的范围内选择随机整数变量,那么在N1/2次选择后发生重复的概率就会超过0.5。因此,对于m位的Hash值,如果我们随机选择数据块,预计在2m/2次尝试后就能找到两个具有相同Hash值的数据块。

  Yuval提出以下策略进行碰撞攻击:

    1、发送方A准备对文本消息x进行签名(尚未签名,但可预期要签名的文件内容),其使用的方法是:用A的私钥对m位的Hash码加密并将加密后的Hash码附于消息之后。

    2、攻击者产生该消息x的2m/2种变式x‘,每种变式都表达相同的意义,将这些消息以及对应的Hash值存储起来。

      产生多个具有相同意义的变式并不难,例如攻击者可以在文件的词与词之间插入若干“空格-空格-退格”字符对,然后在实例中用“空格-退格-空格”替代这些字符,从而产生各种变式。攻击者也可以简单地改变消息中的某些词但不改变消息的意义。

    3、攻击者准备伪造一条消息y,并想获取A的签名,只需要伪造y的变式y‘,然后计算H(y‘),并与所有的H(x‘)进行比对,直到碰撞出现。

    4、攻击者将发生碰撞的消息x‘提供给A签名,然后将该签名附于伪造消息y‘后。这样攻击者就在不知道A密钥的情况下获得了有A数字签名的消息y‘,并可以此获利。

  2、密码分析

  对Hash函数的密码分析攻击,也是利用算法的某种性质而不是通过穷举来进行攻击的。理想的Hash函数算法要求密码分析攻击所需的代价大于或等于穷举攻击所需的代价。

  

时间: 2024-10-13 18:28:22

密码学Hash函数的相关文章

密码学hash函数-SHA256-512

[latexpage] Hash函数又称哈希函数.散列函数.杂凑函数.它是一种单向密码体制,即从一个从明文到密文的不可逆映射,只有加密过程,没有解密过程. Hash函数H将可变长度的数据块M作为输入,产生固定长度的Hash值h=H(M). 在安全应用中使用的Hash函数称为密码学Hash函数.(单向性).(抗碰撞性) 弱抗碰撞性:给定一个消息M,要找到另一个消息M',使得H(M)=H(M')很难. 强抗碰撞性:要找到两个随机明文M和M',使得H(M)=H(M')很难. Hash函数特点: 1.

密码学---hash函数(SHA-256)的C++实现

1 //SHA-256 2 /*理解算法最重要,最好自己动手实现试试看,可以使用MFC写一个简单的交互界面*/ 3 4 #include <iostream> 5 #include <cstdio> 6 #include <cstdlib> 7 8 using namespace std; 9 10 #define SHA256_ROTL(a,b) (((a>>(32-b))&(0x7fffffff>>(31-b)))|(a<<

密码学之《Hash函数》

延续昨天的肚子疼- -我们来继续看密码学. Hash函数是啥? Hash函数将任意长度的消息压缩为某一固定长度的消息摘要的函数.是多对一的映射. Hash函数有啥用? 1. 最基础的,加密.sha系列,md5等等一大波常用的加密都属于Hash函数. 2. 用于数字签名(关于数字签名,请看:http://www.cnblogs.com/kuoaidebb/p/4183605.html).主要作用有两个:一,提高签名速度.由于Hash函数是消息摘要,在一定程度上缩短需要签名的消息的长度.二,不泄露签

使用Hash函数和MAC产生伪随机数

基于Hash函数的PRNG 流程非常类似于对称密码的CTR工作模式 算法的伪码如下 m = ⌈n/outlen⌉ data = V W = the null String for i = 1 to m wi = H(data) W = W || wi data = (data + 1) mod 2seedlen return leftmost n bits of W 说明: V是种子,seedlen为V的长度,n是需要的输出位数,H是Hash函数 对于诸如SHA-2等强密码学Hash算法,目前还

应用Hash函数

计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人类”的语言描述单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来:而当给定结果的时候,很难计算出输入来,这就是单项函数.各种加密函数都可以被认为是单向函数的逼近.Hash函数(或者成为散列函数)也可以看成是单向函数的一个逼近.即它接近于满足单向函数的定义. Hash函数还有另外的含义.实际中的Hash函数是指把一个大范围映射到一个小范围.把大范围

Hash函数及其应用

本文部分内容摘自网络,参考资料链接会在文后给出,在此感谢原作者的分享. 计算理论中,没有Hash函数的说法,只有单向函数的说法.所谓的单向函数,是一个复杂的定义,大家可以去看计算理论或者密码学方面的数据.用“人类”的语言描述,单向函数就是:如果某个函数在给定输入的时候,很容易计算出其结果来:而当给定结果的时候,很难计算出输入来,这就是单向函数.各种加密函数都可以被认为是单向函数的逼近.Hash函数(或者称为散列函数)也可以看成是单向函数的一个逼近.即它接近于满足单向函数的定义. Hash函数还有

Bloom filter的实现以及常用的hash函数

bloom filter利用时间换空间的思想,利用多个哈希函数,将一个元素的存在状态映射到多个bit中,特别是在网络环境中,BF具有广泛的用途,关键问题就是要减少false positive rate(可以设置参数来调节),扩展有 counting BF.这里选用的hash函数是表现较好的 BKDRHash , SDBMHash, DJBHash . Bloom-filter代码: bloom_filter.h #ifndef __BLOOM_FILTER_H__ #define __BLOOM

Hash函数的安全性

我们为了保证消息的完整性,引进了散列函数,那么散列函数会对安全正造成什么影响呢?这是需要好好研究一番的问题. 三个概念: 1.如果y<>x,且h(x)=h(y),则称为碰撞. 2.对于给定的x,要找到一个y满足y<>x,h(x)=h(y),在计算上不可行,称为弱无碰撞. 3.要找到任意一对数,x,y,y<>x,满足h(x)=h(y),在计算上不可行,则称为强无碰撞.(包含弱无碰撞) 假定:一个取整数的随机变量,服从1到n的随机分布,一个含有k个这种变量的集合,至少有一对

Hash表的hash函数,冲突解决方法有哪些

最常用的3个HASH函数: 1. 除法散列法:通过取k除以m的余数,来将关键字k映射到m个槽的某一个中去,即散列函数为: h(k) = k mod m 2. 乘法散列法:首先,用关键字k乘上常数A(0<A<1),并抽取kA的小数部分:然后,用m乘以这个值,再取结果的底(即整数部分).散列函数可表达为: h(k) = ⌊m(kA mod 1)⌋ 3.全域散列法(universal hashing) 解决冲突常用的两种方法: 1. 链接法(chaining):把散列到同一槽中的所有元素都存放在一个