购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

3.5 Hash函数与MAC算法

信息技术为现代社会带来的一个重大改变是电子商务,它极大地促进了传统商务模式的改变和结构的更新。而电子商务的发展,对信息安全技术又提出了多方位的新要求,主要表现在形形色色的签名与认证需求方面。

3.5.1 Hash函数

Hash函数又称哈希函数,也被称为散列算法。其主要功能是把任意长度的输入通过散列算法变换成固定长度(如128位、160位)的代码串输出,该输出就是散列值。或者说Hash函数就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。Hash算法没有一个固定的公式,只要符合散列思想的算法都可以被称为Hash算法。

Hash函数(在不严格意义下)是满足下列三条性质的函数 h

· 压缩性: h 将任意有限比特长度的输入 x 映射为固定长度为 n 的输出 h ( x )。

· 单向性:给定 h 和输入 x ,容易计算出 h ( x ),而由 h h ( x )计算 x 是不可行的。

· 抵抗碰撞:找到两个不同的输入 x x ′,使等式 h x )= h x ′)成立。这在计算上不可行(注意:这里两个输入可以自由选择)。

单向Hash函数用于产生信息摘要。信息摘要简要地描述了一份较长的信息或文件,它可以被看作一份长文件的“数字指纹”。信息摘要用于创建数字签名,对于特定的文件而言,信息摘要是唯一的。信息摘要可以被公开,它不会透露相应文件的任何内容。

MD5算法(Message Digest Algorithm5,信息摘要算法第5版)是一种通过计算机程序将任意长程序压缩为128比特消息摘要的算法,是由Ron Rivest设计的专门用于加密处理,并被广泛使用的Hash函数。

MD5首先将明文 x 按512比特分组,最后不足512比特的部分,扣除末尾64比特后添一个1和 d 个0,凑成448比特,再把这64比特加在末尾,使之也成为512比特的一部分。明文共分为 N 组,且每一分组又被划分为16个32位子分组,经过一系列的处理后,算法的输出由4个32位分组组成,将这4个32位分组级联后生成一个128位散列值(即128位的信息摘要)。MD5可以对任何文件产生一个唯一的MD5码,如同每个人的指纹一样,每个文件的MD5码都是不同的,这样,一旦这个文件在传输过程中,其内容被损坏或者被修改,那么该文件的MD5码就会发生变化,通过对文件MD5的验证,可以得知获得的文件是否完整。

MD5算法曾经被认为是牢不可破的,如果采用常规的计算方式,即使用当时最快的巨型计算机也要运算100万年以上才能破解。美国一直在向全世界推广MD5算法,而且多次声称“没人能破解我们的MD5密码”,就连国际著名的密码学家Biham也把破解MD5密码作为一生的梦想。但在2004年8月的国际密码学会议上,我国王小云院士团队宣布破译了MD5算法在内的四个在国际上有着举足轻重地位的Hash函数算法,在密码学界引起巨大轰动。使用王小云院士的方法,普通计算机只需要一个多小时就能破解国际密码标准MD5。仅仅半年后,2005年2月,王小云院士团队又成功破译了被美国国家标准技术研究院(NIST)称为“没有任何人能破解”的SHA-1密码。至此,世界上公认的两种最安全、最先进、应用最广泛的密码算法都被中国人破译。王小云院士和她的团队在密码学领域做出的巨大贡献,增强了中国人在信息安全领域的话语权。后来在王小云院士的带领下,她的团队设计出了我国基于Hash函数标准的SM3算法,这项算法很快就在我国金融、交通、国家电网等重要经济领域广泛使用。这项算法也于2018年10月正式成为ISO国际标准,被世界各国广泛采用。

SM3算法采用哈希函数标准,用于替代MD5、SHA-1、SHA-2等国际算法,是在SHA-256基础上改进实现的一种算法,消息分组长度为512比特,摘要值长度为256比特,其中使用了异或、模、模加、移位、与、或、非运算,由填充、迭代过程、消息扩展和压缩函数。在商用密码体系中,SM3主要用于数字签名及验证、消息认证码生成及验证、随机数生成等。据国家密码管理局表示,其安全性及效率要高于MD5算法和SHA-1算法,与SHA-256相当。

3.5.2 MAC算法

消息认证码(Message Authentication Code,MAC)是消息和密钥的公开函数,它产生定长的值,以该值作为认证符。利用密钥和消息生成一个固定长度的短数据块,并将其附加在消息之后。消息认证包含以下三个方面。

· 对消息内容的认证。接收方可以相信消息未被修改,因为如果攻击者改变了消息,由于不知道 k ,无法生成正确的MAC。

· 对消息来源的认证。接收方可以相信消息的确来自确定的发送方。因为其他人不能生成和原始消息相应的MAC。

· 对消息时效性的认证。消息在传输过程中可能被重传或延迟,接收方可通过消息认证码验证消息发送的先后顺序以及是否实时发送。

消息认证过程没有第三方参与,只在通信双方之间进行。消息认证的实质是:发送方通过双方协商某种函数,以待发消息作为输入产生一个叫作消息认证码的认证信息,该信息值对于要保护的消息来说是唯一的,它与原始消息一起在公开信道上传送;接收方收到消息后,使用相同的函数再次计算收到的消息,也得到一个认证信息码;如果两个认证信息码相同,则说明消息是合法可信的。典型的消息认证系统如图3-15所示。

图3-15 典型的消息认证系统

MAC函数与加密函数类似,都需要明文、密钥和算法的参与。但MAC算法不要求可逆性,而加密算法必须是可逆的。例如:使用100比特的消息和10比特的MAC,那么总共有2 100 个不同的消息,但仅有2 10 个不同的MAC。也就是说,平均每2 90 个消息使用的MAC是相同的。因此,认证函数比加密函数更不易被攻破,因为即便攻破也无法验证其正确性。关键就在于加密函数是一对一的,而认证函数是多对一的。

3.5.3 算法应用

1.完整性服务解决方案

数据完整性检验通常是通过密码学中的单向散列函数(Hash函数)来实现的。单向散列函数能够将任意长度的输入转化为一个固定大小的消息摘要,记为:

上式表明,单向散列函数 h 将任意长度的比特串{0,1} * 映射成长度为 n 的比特串{0,1} n 。单向散列函数具有错误检测的能力,即改变输入数据的任何一位或者多位,都会导致消息摘要的改变。根据消息 m 和消息摘要 h m )的对应关系,接收者可以判断消息在传输过程中是否被篡改过。

美国国家标准技术研究所和一些国际组织不断地制定和颁布单向散列函数标准。1991年,美国麻省理工计算机科学实验室(MIT Laboratory for Computer Science)和RSA数据安全公司(RSA Data Security Inc.)的Ronald L. Rivest教授开发出MD5算法(Message Digest Algorithm 5)。1993年,美国NIST公布了FIPS PUB 180,通常称为SHA-0(Secure Hash Algorithm)。1995年,美国NIST对SHA-0进行了改进,公布了FIPS PUB 180-1,称为SHA-1。SHA-1对输入按512比特进行分组,并以分组为单位进行处理,输出为160位的数据摘要。为了增加单向散列函数的安全性并与加密标准AES配套,2002年,美国NIST公布了SHA的修订版FIPS PUB 180-2,称为SHA-2。SHA-2包含若干单向散列函数,其输出的数据摘要长度分别为256、384和512比特,分别称为SHA-256、SHA-384和SHA-512。

例3-13 单向散列函数示例

2.认证性服务解决方案

为了认证消息的完整性,需要对消息生成某种形式上的鉴别符,通过对鉴别符的分析,可以得知原始消息是否完整。在密码学中,消息加密、单向散列函数和消息认证码(Message Authentication Code,MAC)都是消息认证的重要手段。消息加密是将需要认证的消息加密,以加密的结果作为鉴别符。单向散列函数是将需要认证的消息通过一个公共函数映射为定长的消息摘要,以消息摘要作为鉴别符。消息认证码是将需要认证的消息通过一个公共函数的作用,以产生的结果和密钥作为鉴别符。

利用消息认证码对消息进行认证的过程是这样的:发送者Alice利用MAC函数 f 和密钥 k 把需要认证的消息 m 变换成 n 比特的消息认证码 f ( k , m ),将消息认证码 f ( k , m )作为鉴别符附加在消息 m 之后,发送消息序列 给接收者Bob,如图3-16所示。接收者Bob收到Alice发送的消息序列 后,按照与发送者Alice相同的方法对接收的数据 m 进行计算,得到 n 比特的消息认证码 f ′( k m ),然后比较 f ′( k m )和 f k m )是否一致。如果一致,则消息认证成功;否则,消息认证失败。在该认证过程中,即使攻击者Eve篡改了消息 m ,在不知道密钥 k 的情况下,Eve也不可能计算出正确的消息认证码 f k m )。接收者Bob通过比较 f ′( k m )和 f k m )是否一致,可以判断消息 m 在传输过程中是否被篡改。

图3-16 利用消息认证码进行认证的过程

实现消息认证码可以有多种方法。基于单向散列函数的消息认证码(Hash-based Message Authentication Code,HMAC)算法和基于分组密码的消息认证码(Cipher-based Message Authentication Code,CMAC)算法是目前广泛使用的两种消息认证码算法。HMAC算法像单向散列函数算法一样输出一个固定大小的消息标记,但是,与单向散列函数算法不同的是,HMAC算法需要使用密钥来阻止任何对消息标记的伪造,记为

CMAC算法以分组加密为基础,将完整性校验消息 m 进行分组得到 ,利用完整性校验密钥 k 和初始向量(IV)对消息 m 进行递进分组加密,最后输出消息认证码MAC,如图3-17所示。

图3-17 CMAC算法原理

公钥算法是实现认证的另一种方法,与HMAC算法和CMAC算法不同的是,基于公钥的认证算法不需要通信双方在通信之前共享私有信息。采用什么样的认证算法取决于认证系统的构造。在传输信道安全的情况下,使用HMAC算法和CMAC算法可以提高通信效率,节省通信资源。基于公钥的认证算法通常用于通信双方的初始认证。 V6QLAeiNsKxKsB09yE8+ZhU/jmWHGx4jzvglbJkf/oLWBJnkJuUlTXO+tj4K+vni

点击中间区域
呼出菜单
上一章
目录
下一章
×