hmac算法分析
hash函数是一种常见的单向不可逆加密函数,本篇主要分析hks_mbedtls_hash.c代码
文件路径(security_huks\frameworks\huks_standard\main\crypto_engine\mbedtls\src\hks_mbedtls_hash.c)
一、背景知识介绍
1.什么是Hmac算法
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code)的缩写,由H.Krawezyk,M.Bellare,R.Canetti于1996年提出的一种基于Hash函数和密钥进行消息认证的方法,并于1997年作为RFC2104被公布,并在IPSec和其他网络协议(如SSL)中得以广泛应用,现在已经成为事实上的Internet安全标准。它可以与任何迭代散列函数捆绑使用。
简单地说就是:HMAC是一种使用单向散列函数来构造消息认证码的算法。
HMAC算法利用哈希运算,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。其安全性是建立在Hash加密算法基础上的。它要求通信双方共享密钥、约定算法、对报文进行Hash运算,形成固定长度的认证码。通信双方通过认证码的校验来确定报文的合法性。HMAC算法可以用来作加密、数字签名、报文验证等[2]。HMAC使用的Hahs函数并不仅限于一种,任何高强度的单向散列函数都可以被用于HMAC,如果将来设计出的新的单向散列函数,也同样可以使用。使用SHA-1、SHA-224、SHA-256、SHA-384、SHA-512所构造的HMAC,分别称为HMAC-SHA1、HMAC-SHA-224、HMAC-SHA-256、HMAC-SHA-384、HMAC-SHA-512。
2.Hmac算法处理步骤
算法计算步骤图:
1. 密钥处理
\quad
如果密钥比单向散列函数分组长度要短,就需要在末尾填充0,直到其长度达到单向散列函数的分组长度为止。
\quad
如果密钥比分组长度要长,则要用单向散列函数求出密钥的散列值,然后将这个散列值用作HMAC的密钥。
2. 处理后的密钥与ipad进行XOR
\quad
将处理后的密钥与被称为ipad的比特序列进行XOR运算。ipad是将00110110这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中ipad的i是inner的意思。
\quad
XOR运算所得到的值,是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为ipadkey。
3. 与消息组合
\quad
随后,将ipadkey与消息组合,也就是将和密钥相关的比特序列(ipadkey)附加在消息的开头。
4. 计算散列值
\quad
将步骤③的结果作为单向散列函数的输入,并计算出散列值。
5. 处理后的密钥与opad进行XOR
\quad
将填充后的密钥与被称为opad的比特序列进行XOR运算,opad是将01011100这一比特序列不断循环反复直到达到分组长度所形成的比特序列,其中opad的o是outer的意思。
\quad
XOR运算所得到的结果也是一个和单向散列函数的分组长度相同,且和密钥相关的比特序列。这里将这个比特序列称为opadkey。
6. 与散列值组合
\quad
将步骤④的结果拼在opadkey的后面。
7. 计算散列值
\quad
将步骤⑥的结果输入单向散列函数,并计算出散列值,这个散列值就是最终的MAC值。
通过上述流程可以看出,最后得到的MAC值,一定是一个和输入的消息以及密钥都相关的长度固定的比特序列。
二、代码分析
hmac函数用来生成一个消息验证码,同时最后得到的消息验证码一定是一个和输入信息以及选用密钥、算法有关的长度固定的序列。
参数详解:
- key:hmac所用到的密钥信息
- digestAlg:hash算法名称
- msg:存放传入的消息,相当于输入信息。
- mac:存放最后hmac算法的结果
//hmac算法实现
int32_t HksMbedtlsHmac(const struct HksBlob *key,
uint32_t digestAlg, const struct HksBlob *msg, struct HksBlob *mac)
{
/* input params have been checked */
uint32_t mbedtlsAlg;
int32_t ret = HksToMbedtlsDigestAlg(digestAlg, &mbedtlsAlg);
//将传入的摘要算法转换为mbedtls库中算法
if (ret != HKS_SUCCESS) {
return ret;
}
ret = mbedtls_md_hmac(mbedtls_md_info_from_type(mbedtlsAlg),
key->data, key->size, msg->data, msg->size, mac->data);
//hmac算法实现设置密钥,填充消息,生成消息验证码
if (ret != HKS_MBEDTLS_SUCCESS) {
HKS_LOG_E("Mbedtls hmac failed! mbedtls ret = 0x%X", ret);
(void)memset_s(mac->data, mac->size, 0, mac->size);
return ret;
}
ret = HksGetDigestLen(digestAlg, &(mac->size));
//将摘要函数对应算法的长度写进mac->size
if (ret != HKS_SUCCESS) {
HKS_LOG_E("Get digest len failed!");
}
return ret;
}
三、总结
以上就是hmac算法函数的介绍,以及代码中的实现。感谢阅读和点赞