在加密领域,哈希函数(散列函数、杂凑函数、Hash)是利用单向哈希函数来验证消息完整性的工具,例如区块链技术广泛使用哈希函数来构建区块和确认交易的完整性,密钥分析学中广泛使用的彩虹表也是哈希值。
哈希和加密过程对比
单向哈希
单向哈希是一种将可变长字符串变换成固定长度输出的函数,输出值称为哈希值。哈希函数是公开的,哈希函数只能从一个方向计算,没有陷门,只是计算一个消息的哈希值,用于判断消息有没有被篡改。例如我们用H(m) =S来表示使用某个单向哈希函数来计算消息m,得到哈希值S,但我们无法从S反推出消息m是什么,如果我把消息m和S一起发给你,你用同样的哈希函数计算m,如果得到的哈希等于S,这就意味着你收到的消息和我的原始消息相同,中途没有被截获篡改。
必须强调的是单纯的单向哈希函数不使用密钥,不能对给你数据的人或者消息本身的真伪进行验证(不保证机密性、无法进行身份验证)。
例如你从某个网站下载共享软件,网站页面上有该软件的哈希值,你可以在完成下载后计算该软件的哈希值,如果跟网站提供的不同,这意味着要么传输途中发生问题,要么网站上的软件被篡改。但是即使哈希值相同,你下载的软件就没有问题吗?如果软件是被植入了木马后再计算哈希呢?这样你下载的软件即使哈希相同,你安装后仍然会把你的电脑当做僵尸网络的一部分。
所以需要多种加密技术一起使用才能获得完整的安全保障。后面的公钥基础架构一文中会专门探讨这个问题,现在我们可以扩展哈希函数,让它也有身份验证的功能,这就是第2节要讨论的MAC函数。
MAC函数
MAC就是消息验证码(Message Authentication Code)。是一种通过将密钥应用到消息上确保消息内容真实性的身份验证方案。
MAC函数的中密钥并不完全是加密消息,这跟对称加密算法的应用有比较大的区别,下面将逐步描述。基本的MAC函数有四种:HMAC、CBC-MAC、CMAC、CCM。
1/4. HMAC
HMAC(基于哈希的消息验证码)和单纯的哈希算法的区别是:消息发送者将一个对称密钥和消息本身拼接在一起输入哈希算法,此时计算出来的哈希值称为MAC值,然后把原始消息和MAC值都发给接收者。接收者收到消息后,同样拼接对称密钥计算MAC值,如果跟收到的相同,那么说明两件事,其一是消息中途没有被篡改,其二是消息是从发送者发来的(身份验证),因为只有接收者和发送者知道对称密钥。所以HMAC提供完整性和数据源验证,但不提供机密性。
HMAC如下图所示:
HMAC(K,M)=H(K⊕opad∣H(K⊕ipad∣M))
HMAC的特点和使用注意事项:
①HMAC的消息并没有加密,就是说传输途中被截获的话无法保证机密性。
②要求发送方和接收方都有对称密钥,但是HMAC没有对称密钥安全分发功能。可使用DH的密钥协商或者RSA密钥交换来实现。
2/4. CBC-MAC
CBC-MAC就是使用CBC模式的MAC。一般使用AES算法的CBC分组模式。CBC-MAC提供完整性和数据源验证,也不提供机密性。
CBC-MAC的基本步骤是:
①发送方用一个分组密码以CBC工作模式对消息进行加密,密文的最后一个分组作为MAC。发送方把明文消息及附加的MAC而不是加密后的消息发送给接收方。
②接收方收到明文消息,在CBC工作模式下使用相同的分组密码对消息进行加密,计算出的MAC值与跟随消息一起发送的MAC进行比较,即可检测消息是否被篡改。