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;
}