使用 openssl 进行哈希计算

版本:OpenSSL 3.0.2 15 Mar 2022 (Library: OpenSSL 3.0.2 15 Mar 2022)

SHAx 系列

如果对象完全存储在内存中,可以使用以下函数:

cpp 复制代码
#include <openssl/sha.h>

unsigned char *SHA1(const unsigned char *data, size_t count, unsigned char *md_buf);
unsigned char *SHA224(const unsigned char *data, size_t count, unsigned char *md_buf);
unsigned char *SHA256(const unsigned char *data, size_t count, unsigned char *md_buf);
unsigned char *SHA384(const unsigned char *data, size_t count, unsigned char *md_buf);
unsigned char *SHA512(const unsigned char *data, size_t count, unsigned char *md_buf);

使用示例:

cpp 复制代码
int i = 0;
const char *data = "Hello World";
unsigned char sha1[SHA_DIGEST_LENGTH];

SHA1(data, strlen(data), sha1);

printf("%s sha1 = ", data);
for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
    printf("%02x", sha1[i]);
}

SHAx_Init 系列

如果对象未完全存储在内存中,可以使用以下函数(注意:以下函数已经在 3.0 版本中废弃):

cpp 复制代码
int SHA1_Init(SHA_CTX *c);
int SHA1_Update(SHA_CTX *c, const void *data, size_t len);
int SHA1_Final(unsigned char *md, SHA_CTX *c);

int SHA224_Init(SHA256_CTX *c);
int SHA224_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA224_Final(unsigned char *md, SHA256_CTX *c);

int SHA256_Init(SHA256_CTX *c);
int SHA256_Update(SHA256_CTX *c, const void *data, size_t len);
int SHA256_Final(unsigned char *md, SHA256_CTX *c);

int SHA384_Init(SHA512_CTX *c);
int SHA384_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA384_Final(unsigned char *md, SHA512_CTX *c);

int SHA512_Init(SHA512_CTX *c);
int SHA512_Update(SHA512_CTX *c, const void *data, size_t len);
int SHA512_Final(unsigned char *md, SHA512_CTX *c);

使用示例:

cpp 复制代码
#define OPENSSL_API_COMPAT 0x10100000L /* 在 >= 3.0 版本中需要定义该宏才能使用 SHAx_Init 系列函数,该宏详情见 https://www.openssl.org/docs/man3.2/man7/openssl_user_macros.html */

SHA_CTX c;
int i = 0;
const char *data = "Hello World";
unsigned char sha1[SHA_DIGEST_LENGTH];

SHA1_Init(&c);
SHA1_Update(&c, data, strlen(data));
SHA1_Final(sha1, &c);

printf("%s sha1 = ", data);
for (i = 0; i < SHA_DIGEST_LENGTH; i++) {
    printf("%02x", sha1[i]);
}
cpp 复制代码
#define OPENSSL_API_COMPAT 0x10100000L /* 在 >= 3.0 版本中需要定义该宏才能使用 SHAx_Init 系列函数,该宏详情见 https://www.openssl.org/docs/man3.2/man7/openssl_user_macros.html */

int sha1_file(char *file)
{
#define READ_SIZE 128

    if (!file)
        return 0;

    int i = 0;
    int n = 0;
    SHA_CTX c;

    FILE *fp = NULL;
    unsigned char temp[READ_SIZE];
    unsigned char sha1[SHA_DIGEST_LENGTH];

    fp = fopen(file, "r");
    if (!fp)
        return -1;

    SHA1_Init(&c);

    do
    {
        memset(temp, 0, sizeof(temp));
        n = fread(temp, 1, READ_SIZE, fp);
        if (n > 0)
            SHA1_Update(&c, temp, n);
    } while (n > 0);

    SHA1_Final(sha1, &c);
    printf("file [%s] sha1 = ", file);
    for (i = 0; i < SHA_DIGEST_LENGTH; i++)
    {
        printf("%02x", sha1[i]);
    }
    fclose(fp);
    return 0;
}

3.0 版本

3.0 版本推荐使用用 EVP_DigestInit_ex(3), EVP_DigestUpdate(3) , EVP_DigestFinal_ex(3)

使用示例:

cpp 复制代码
int i = 0;
EVP_MD_CTX *ctx = NULL;
const char *data = "Hello World";
unsigned char sha1[SHA_DIGEST_LENGTH];

ctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(ctx, EVP_sha1(), NULL);
EVP_DigestUpdate(ctx, data, strlen(data));
EVP_DigestFinal_ex(ctx, sha1, NULL);
EVP_MD_CTX_free(ctx);

printf("%s sha1 = ", data);
for (i = 0; i < SHA_DIGEST_LENGTH; i++)
{
    printf("%02x", sha1[i]);
}

快速哈希功能

EVP_Q_digest(3)

复制代码
int EVP_Q_digest(OSSL_LIB_CTX *libctx, const char *name, const char *propq,
                 const void *data, size_t datalen,
                 unsigned char *md, size_t *mdlen);

使用示例:

cpp 复制代码
const char *data = "Hello World";
unsigned char sha1[SHA_DIGEST_LENGTH];

EVP_Q_digest(NULL, "SHA1", NULL, data, strlen(data), sha1, NULL)
相关推荐
疯狂打码的少年5 小时前
【数据结构】哈希表:构造与冲突处理
数据结构·笔记·哈希算法·散列表
小飞学编程...15 小时前
【哈希表】
数据结构·哈希算法·散列表
网安蟹佬霸1 天前
密码学安全实战:从加密原理到哈希破解的完整攻防指南
网络·算法·安全·web安全·开源·密码学·哈希算法
liangshanbo12152 天前
前端工程化面试题:打包文件名Hash与浏览器缓存机制
前端·缓存·哈希算法
.道阻且长.3 天前
9.LeetCode算法习题讲解--滑动窗口--无重复字符的最长字串
算法·leetcode·职场和发展·哈希算法
阿无,3 天前
布隆过滤器
java·算法·哈希算法
Chasing__Dreams4 天前
Redis--基础知识点--33--String Hash List Set ZSet
redis·list·哈希算法
三8444 天前
webshell缓存绕过/哈希碰撞
算法·哈希算法
星恒随风5 天前
C++ 哈希详解(二):开放定址、哈希桶与 C++ 哈希表底层实现
c++·笔记·学习·哈希算法·散列表
lingran__5 天前
C++ STL unordered系列(哈希) 底层剖析与模拟实现万字详解 | 基于哈希表,复刻 SGI-STL 泛型哈希容器架构
开发语言·c++·后端·哈希算法·哈希表·泛型编程·unordered系列