在安全应用中使用的Hash函数称为密码学Hash函数
密码学Hash函数要求两种情况在计算上不可行(即没有攻击方法比穷举更有效):
- 对预先指定的Hash值找到对应的数据块(单向性)
-
找到两个不同的数据块对应相同的Hash值(抗碰撞性)
Hash函数被用于判断数据是否被篡改过(数据完整性)
Hash函数的操作过程:
输入数据的长度首先被填充为某固定长度(如1024位)分组的整数倍,填充的内容包括原始消息的位长度信息。填充长度信息能够提高攻击者修改信息而保持Hash值不变的难度。
一、密码学Hash函数的应用
1.消息认证(Message Authentication)
是用来验证消息完整性的一种机制和服务
- 消息认证确保收到的数据确实和发送时的一样(即没有修改、插入、删除或重放)
-
还要求消息认证机制确保发送方声称的身份是真实有效的
当Hash函数用于提供消息认证功能时,Hash函数值通常称为消息摘要
消息认证中使用Hash函数的本质如下:
- 发送者根据待发送的消息使用该函数计算一组Hash值,然后将Hash值和消息一起发送过去
- 接收者收到后对消息执行同样的Hash计算,并将结果与收到的Hash值进行对比
-
如果不匹配则接收者推断出消息(也可能是Hash值)遭到了篡改
Hash函数 的运行结果必须通过安全的方式进行传输。
Hash码能够通过以下方法用于提供消息认证: - 使用对称密码算法加密消息和Hash码
- 使用对称密码算法只对Hash码进行加密
- 不使用加密算法,仅使用Hash函数也能实现消息认证
- 对整个消息和Hash值加密
b所需计算少,a、d需要加密整个消息,如果不要求提供保密性,b比a、d更有优势。
更一般地,消息认证是通过使用消息认证码(MAC)实现的,即带密钥的Hash函数。
通常情况下,通信双方基于共享的同一密钥来认证彼此之间交互的信息时,就会使用MAC。
MAC函数将密钥和数据块作为输入,产生Hash值作为MAC码,然后将MAC码和受保护的消息一起传递或存储。
检查消息完整性的时候,使用MAC函数对消息重新计算,并将计算结果与存储的MAC码对比。
攻击者能对消息进行篡改,但是在不知道密钥的情况下不能够计算出与篡改后的消息相匹配的MAC值。
MAC是Hash函数和加密函数操作的结合,即对于函数E(K,H(M)),长度可变的消息M和密钥K是函数的输入,输出是固定长度的值。MAC提供安全保护,用于抵抗不知道密钥的攻击者的攻击,
2.数字签名
在数字签名时,使用发送方的私钥加密消息的Hash值,其他任何知道该发送方公钥的人都能通过数字签名来验证消息的完整性。
攻击者想要篡改消息,需要知道用户的私钥。
数字签名的应用比消息认证更广泛。
3.其他应用
- 用于产生单向口令文件(操作系统存储口令的Hash值而不是口令本身)
- 用于入侵检测和病毒检测
- 用于构建随机函数(PRF)或用作伪随机数发生器(PRNG),基于Hash函数的PRF课用于对称密码中的密钥产生
二、密码学Hash函数的安全需求
三、对Hash函数的攻击
- 穷举攻击:不依赖任何算法的细节,仅与算法所产生的Hash值的长度有关。
- 密码分析:依赖于具体算法的设计缺点
安全Hash码的一般结构:
四、安全Hash函数(SHA)
SHA算法建立在MD4算法之上,其基本框架也与MD4类似。
SHA-1产生160位Hash值
SHA-2的Hash值长度分别为256,384,512,分别称为SHA-256,SHA-384,SHA-512。
SHA-3:基本迭代结构为海绵结构,海绵结构与其他迭代Hash函数的结构相似。
在海绵函数中,输入消息被分块为固定长度的分组。
每个分组逐次作为每轮迭代的输入,同时上轮迭代的输出也反馈至下轮的迭代中,最终产生一组输出块。
海绵函数的输入、输出:
海绵函数的迭代结构:
SHA-3参数:
消息认证码
消息认证函数:
1.消息加密
消息加密本身提供了一种认证手段。对称密码和公钥密码体制中,对消息加密的分析是不同的。
- 对称加密
-
公钥加密
直接使用接收方公钥加密可提供保密性,但不能提供认证
发送方私钥加密消息(数字签名),接收方用发送方的公钥对消息进行解密(验证签名),提供了认证。
既要保密又要认证:发送方私钥加密(数字签名),发送方用接收方的公钥对上述结果进行加密(保密性)。 缺点:一次通信中要执行4次而不是两次复杂的公钥算法
2.消息认证码
又称密码校验和或MAC,也是一种认证技术。它利用密钥来生成一个固定长度的短数据块,并将该数据块附加在消息之后。
MAC算法不要求可逆性,加密算法必须可逆
对MAC的攻击:
- 穷举攻击:攻击密钥空间和MAC值
- 密码分析
基于Hash函数的MAC(HMAC)
基于分组密码的MAC(数据认证算法DAA、基于密码的消息认证码CMAC)
认证加密(分组密码链——消息认证码CCM、Galoid/计数器模式GCM)
基于Hash函数、基于MAC的PRNG
数字签名
一、数字签名简介
数字签名过程的一般模型:
在收发双方不能完全信任的情况下,需要除认证之外的其他方法来解决他人伪造或当事人否认的问题。
数字签名是解决这个问题最好的方法。
数字签名必须具有的特征:
- 验证签名者、签名日期和时间(消息来源)
- 认证被签的消息内容(数据完整性)
- 签名由第三方仲裁以解决争执
数字签名具有认证功能。
攻击:
伪造:
数字签名应满足的条件:
直接数字签名:
只涉及通信双方(发收双方)的数字签名方案
假定接收方已知发送方的公钥,用共享的密钥(对称密码)对整个消息和签名加密,则可以获得保密性
先进行签名,再执行外层的加密,在发生争执时,第三方可以查看消息及签名。
该方法的有效性依赖于发送方私钥的安全性。
二、数字签名算法(DSA)
使用安全Hash算法(SHA),最新版本还包括基于RSA和椭圆曲线密码的数字签名算法。
两种数字签名的方法:
DSA使用的是只提供数字签名功能的算法,与RSA不同,DSA虽然是一种公钥密码方案,但不能用于加密或密钥交换。
在RSA方法中,Hash函数的输入是要签名的消息,输出是定长的Hash码,用发送方的私钥将该Hash码加密成签名,然后发送消息及其签名。接收方收到消息,计算Hash码。接收方用发送方的公钥对签名解密,如果计算出的Hash码与解密出的结果相同,则认为签名是有效的。因为只有发送方拥有私钥,所以只有发送方能够产生有效的签名。
DSA方法也使用Hash函数,它产生的Hash码和为此次签名而产生的随机数k作为签名函数的输入,签名函数依赖于发送方的私钥和一组参数,这些参数为一组通信伙伴所共有,我们可以认为这组参数构成全局公钥。签名由两部分组成,标记为s和r。
DSA是建立在求离散对数之困难性以及ElGamal和Schnorr最初提出的方法之上。
三、椭圆曲线数字签名算法(ECDSA)
用户认证
一、双向认证(Mutual Authentication)
使通信双方互相认证彼此身份并交换会话密钥。
已认证的密钥交换主要关注两个问题:保密性和实效性
重放攻击的例子:
防止重放攻击的方法:
-
为每一个用于认证交互的消息附上一个序列号,新的消息只有其序列号满足适当的顺序时才会被接收。
这种方法的难点是要求每一方都跟踪与其交互的通信方最新的序列号。
考虑到开销问题,序列号基本上不会用于认证和密钥交换。
- 为每个消息附上时间戳,要求不同参与者之间的时钟是同步的
- 挑战/应答
二、单向认证(One-Way Authentication)
应用领域:电子邮件服务
邮件消息需要加密,并且邮件处理系统不拥有解密密钥
认证的作用是接收者需要确保消息确实来自于所谓的发送者