Hash 是一种从一段数据中创建小的数字“指纹”的方法。就像一个人的指纹代表一个人的信息一样,Hash 对输入的数据进行整理,生成一个代表该输入数据的“指纹” 数据。通常该指纹数据也可称之为摘要、散列、校验和。常见的 Hash 有 CRC、SHA1、SHA2、SHA3、SHA256 和 MD5。
生成 Hash_code 的数学表达使可以简写为:
hash_code = sha256(message);
MAC,即消息认证码。与Hash 类似,它也用一段小的数据(称为MAC)来代表一段数据,不同的是,MAC 在生成消息认证码时使用对称加密来保证数据来自约定好的合法的伙伴。
mac_code 的计算方法可以通过下述数学公式进行表达:
mac_code = mac_algorithm(mac_key + message);
MAC 的认证机制如下:
MAC可用于数据完整性和身份验证。消息、密钥中的任何更改都会导致不同的 MAC,因此只要没有密钥,攻击者就无法识别和验证MAC。
MAC 算法面临的常见威胁是长度扩展攻击。要实现长度扩展攻击只需要知道密钥的长度和使用的算法即可。
假设 MAC 算法是:
mac_code = md5("my_key" + "my_message1")
原始要发送的消息+mac 是:
"my_message1" + mac1
然而使用过 md5 计算的开发人员都知道,MD5 计算具备可循环冗余计算的特性:
md5_code1 = md5("base");
md5_code2 = md5(md5_code1 + "extern");
其中,md5_code1、md5_code2 都是正确的 md5 mca。即在计算 md5 mac 时,可以在上一次的基础上追加一个数据,得到的 MD5 数据仍旧是正确的 MD5 mac。
那么作为攻击者,要实现长度扩展攻击,主要需完成下面几步:
HMAC 算法本质属于 MAC 算法的一种。其保留了对称密钥、生成 MAC 消息认证码的特点。但是进一步结合了哈希函数和密钥加密技术。
根据用于计算 MAC 的哈希函数,可以定义许多示例,目前主要集合了MD和SHA两大系列消息摘要算法。其中MD系列的算法有HmacMD2、HmacMD4、HmacMD5三种算法;SHA系列的算法有HmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、HmacSHA512五种算法。
HAMC 通常可以使用下述数学表达式来简单概述:
HMAC = Hash(key1 + Hash(key2 + message))
HMAC 使用两个密钥,并执行两轮哈希计算。该算法的第一轮从原始消息和第一个密钥 K1 生成内部哈希 HMAC1。然后,第二轮使用生成的内部哈希和第二个密钥 K2 创建最终的 HMAC。接收方计算自己的 HMAC,并将其与接收的 HMAC 进行比较,以验证消息的身份验证和完整性,如下图所示:
HMAC算法的一个典型应用是用在“挑战/响应”(Challenge/Response)身份认证中,认证流程如下:
(1) 先由客户端向服务器发出一个验证请求。
(2) 服务器接到此请求后生成一个随机数并通过网络传输给客户端(此为挑战)。
(3) 客户端将收到的随机数与自己的密钥进行HMAC-SHA1运算并得到一个结果作为认证证据传给服务器(此为响应)。
(4) 与此同时,服务器也使用该随机数与存储在服务器数据库中的该客户密钥进行HMAC-SHA1运算,如果服务器的运算结果与客户端传回的响应结果相同,则认为客户端是一个合法用户 。
从挑战-应用的使用场景看 HMAC 算法的安全性:
HMAC算法引入了密钥,其安全性已经不完全依赖于所使用的HASH算法,安全性主要有以下几点保证:
(1)使用的密钥是双方事先约定的,第三方不可能知道,因此数据的收发方是可信的。由上面介绍应用流程可以看出,作为非法截获信息的第三方,能够得到的信息只有作为“挑战”的随机数和作为“响应”的HMAC结果,无法根据这两个数据推算出密钥。由于不知道密钥,所以无法仿造出一致的响应。
(2) HMAC算法与一般的加密重要的区别在于它具有“瞬时”性,即破解只在本条消息有效,对其他消息被破解无法提供帮助,而加密算法被破解后,以前的加密消息就可能被解密。