鸿蒙源码分析(四十三)

本文详细介绍了哈希函数的基本概念,包括其单向性和可重复性特点,并探讨了常见的哈希算法如MD5和SHA系列。接着,对hks_openssl_hash.c代码进行了分析,重点在于参数检查和实际的哈希过程。代码首先通过CheckDigestAlg函数验证摘要算法,然后在HashCheckParam中检查输入和输出参数的合法性,最后在HksOpensslHash函数中使用OpenSSL库执行哈希运算。
摘要由CSDN通过智能技术生成

hks_openssl_hash.c代码分析

一、hash函数介绍

1.哈希

将数据打乱混合,通过散列算法,重新创建一个叫做散列值的指纹,通常用一个短的随机字母和数字组成的字符串表示散列值。

2.哈希算法特点

2.1 单向不可逆性

哈希(Hash)算法是一种单向密码体制,即只有加密过程,没有解密过程。

2.2 可重复性

相同输入经过同一哈希函数得到相同散列值,但并非散列值相同则输入结果相同。

哈希函数是一种无需密钥对的加密方式
无需借助任何秘钥,主要用于针对对称和非对称加密过程中需要保护的部分提供完整性、防伪造的支持。
常见的哈希函数有:MD5,SHA-1,SHA-2(SHA256\SHA384\SHA512),SHA-X(系列)

二、代码分析

代码结构简单,前两个函数主要是参数的检查,最后一个函数HksOpensslHash实现hash过程。

//检查摘要算法是否为SHA256\SHA384\SHA512
static int32_t CheckDigestAlg(uint32_t alg)
{
    switch (alg) {
        //判断是什么算法
        case HKS_DIGEST_SHA256:
        case HKS_DIGEST_SHA384:
        case HKS_DIGEST_SHA512:
            break;
        default:
            HKS_LOG_E("Unsupport HASH Type!");
            return HKS_ERROR_INVALID_DIGEST;
    }
    return HKS_SUCCESS;
}
//HASH过程检查参数
static int32_t HashCheckParam(uint32_t alg, const struct HksBlob *msg, struct HksBlob *hash)
{
    if (CheckDigestAlg(alg) != HKS_SUCCESS) {
        //检查参数前检查摘要算法
        HKS_LOG_E("Unsupport HASH Type!");
        return HKS_ERROR_INVALID_DIGEST;
    }
    if (HksOpensslCheckBlob(hash) != HKS_SUCCESS) {
        //检查hash的data域和size是否合法
        HKS_LOG_E("Invalid param hash!");
        return HKS_ERROR_INVALID_ARGUMENT;
    }
    if (HksOpensslCheckBlob(msg) != HKS_SUCCESS) {
        //检查最后存放消息的结构体
        HKS_LOG_E("Invalid param msg!");
        return HKS_ERROR_INVALID_ARGUMENT;
    }
    return HKS_SUCCESS;
}
//openssl的hash过程
int32_t HksOpensslHash(uint32_t alg, const struct HksBlob *msg, struct HksBlob *hash)
{
    int32_t ret = HashCheckParam(alg, msg, hash);
    //执行前先检查参数
    if (ret != HKS_SUCCESS) {
        HKS_LOG_E("Invalid Params!");
        return HKS_ERROR_INVALID_ARGUMENT;
    }

    const EVP_MD *opensslAlg = GetOpensslAlg(alg);
    //将选择的哈希算法写进opensslAlg中
    if (opensslAlg == NULL) {
        HKS_LOG_E("get openssl algorithm fail");
        return HKS_ERROR_CRYPTO_ENGINE_ERROR;
    }

    ret = EVP_Digest(msg->data, msg->size, hash->data, &hash->size, opensslAlg, NULL);
    //实现哈希过程,一meg为输入信息,经过hash函数输出
    if (ret != HKS_OPENSSL_SUCCESS) {
        HksLogOpensslError();
        return HKS_ERROR_CRYPTO_ENGINE_ERROR;
    }
    return HKS_SUCCESS;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值