一、 基本用法
1 | // 创建MD5哈希对象 |
必要头文件
1 |
通过枚举关联算法长度和实现
1 | enum class HashType : char { |
二、核心实现步骤
2.1、EVP_MD_CTX_new
创建并初始化一个哈希函数上下文 EVP_MD_CTX 对象
1 | EVP_MD_CTX *EVP_MD_CTX_new(void); |
返回值:一个指向 EVP_MD_CTX 结构体对象的指针
EVP_MD_CTX 是 OpenSSL 中用于保存哈希函数上下文信息的结构体。它包含了执行哈希计算所需的各种状态、缓冲区和上下文信息。
调用 EVP_MD_CTX_new 函数会分配内存,并对 EVP_MD_CTX 结构体对象进行初始化。之后,可以将该对象传递给其他 OpenSSL 哈希函数相关的函数,以在其中进行进一步的处理和计算。
1 | m_ctx = EVP_MD_CTX_new(); |
2.2、EVP_DigestInit_ex
用于初始化哈希(散列)函数的上下文
1 | int EVP_DigestInit_ex(EVP_MD_CTX *ctx, const EVP_MD *type, ENGINE *impl); |
参数解释:
ctx:指向要初始化的EVP_MD_CTX结构体指针,该结构体用于保存哈希函数的上下文信息。type:指向EVP_MD函数指针,表示要使用的哈希函数的类型。可以使用 OpenSSL 提供的各种哈希函数类型,如 SHA256、SHA512、MD5 等。impl:可选参数,指定在初始化哈希函数上下文时要使用的加密引擎(如果有)。
返回值:
- 1:成功
- 0:失败
1 | int ret = EVP_DigestInit_ex(m_ctx, HashMethods.at(hashType)(),NULL); |
2.3、EVP_DigestUpdate
用于更新哈希函数的上下文,EVP_DigestUpdate 函数将 data 指向的数据添加到哈希函数的上下文中,并在计算摘要时使用这些数据。可以多次调用此函数以处理连续的数据块。
1 | int EVP_DigestUpdate(EVP_MD_CTX *ctx, const void *data, size_t count); |
参数解释:
ctx:指向哈希函数的上下文对象的指针。data:指向要计算摘要的数据的指针。count:要处理的数据的字节数。
返回值:
- 1:成功。
- 0:失败。
1 | const int ret = EVP_DigestUpdate(m_ctx, data, length); |
2.4、EVP_DigestFinal_ex
用于计算哈希函数的最终摘要,并将结果存储在指定的md缓冲区中,s记录数据长度,md和s都是传入传出参数
1 | int EVP_DigestFinal_ex(EVP_MD_CTX *ctx, unsigned char *md, unsigned int *s); |
参数解释:
ctx:指向哈希函数的上下文对象的指针。md:指向存储摘要结果的缓冲区的指针。s:指向用于存储摘要结果长度的变量的指针。
返回值:
- 1:成功
- 0:失败
1 | unsigned int len = 0; |
在调用 EVP_DigestFinal_ex 函数之前,必须先调用 EVP_DigestInit_ex 和 EVP_DigestUpdate 函数,以便初始化哈希函数上下文并处理要计算摘要的数据。
2.5、EVP_MD_CTX_free
用于释放哈希函数的上下文对象所占用的内存空间
1 | void EVP_MD_CTX_free(EVP_MD_CTX *ctx); |
参数解释:
ctx:指向哈希函数的上下文对象的指针。
1 | CryptographicHash::~CryptographicHash() { |
完整示例:
- CryptographicHash.h
1 |
|
- CryptographicHash.cpp
1 |
|