鸿蒙源码分析(三十九)

本文详细介绍了HMAC算法的背景知识,包括其定义、处理步骤,并结合代码分析了HMAC在hks_mbedtls_hash.c文件中的实现过程。通过对密钥的处理、消息的XOR操作以及散列值的计算,展示了HMAC如何生成与输入消息和密钥相关联的固定长度消息验证码。
摘要由CSDN通过智能技术生成


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算法函数的介绍,以及代码中的实现。感谢阅读和点赞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值