当前位置:   article > 正文

鸿蒙源码分析(三十九)_鸿蒙开发 hmac

鸿蒙开发 hmac


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;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

三、总结

以上就是hmac算法函数的介绍,以及代码中的实现。感谢阅读和点赞

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/700895
推荐阅读
相关标签
  

闽ICP备14008679号