C/C++实现hmacSha256+base64

文章目录

  • HMAC
    • 工作原理
    • 应用场景
  • SHA-256
    • 工作原理
    • 应用场景
  • Base64
    • 工作原理
    • 应用场景
  • C/C++实现HMAC-SHA256
  • 相关文章

HMAC

HMAC(Hash-based Message Authentication Code)即基于哈希的消息认证码,它是一种使用加密哈希函数来验证消息完整性和真实性的机制。

工作原理

HMAC 使用一个密钥和一个哈希函数来生成一个固定长度的认证码。发送方和接收方事先共享一个密钥。发送方将消息和密钥结合,使用哈希函数生成一个 HMAC 值,然后将消息和 HMAC 值一同发送给接收方。接收方使用相同的密钥和哈希函数对收到的消息重新计算 HMAC 值,并与接收到的 HMAC 值进行比较。如果两者相同,则说明消息在传输过程中没有被篡改,并且确实是由持有相同密钥的发送方发送的。

应用场景

  1. 网络通信:在网络协议中,如 SSL/TLS、IPsec 等,HMAC 用于验证消息的完整性和真实性,防止中间人攻击。
  2. API 认证:在 API 调用中,使用 HMAC 可以确保请求是由合法的客户端发送的,并且请求内容在传输过程中没有被篡改。
  3. 文件完整性验证:可以使用 HMAC 来验证文件在传输或存储过程中是否被修改。

SHA-256

SHA-256 是 SHA-2(安全哈希算法 2)家族中的一员,属于密码学哈希函数。它能将任意长度的输入数据转化为固定长度(256 位,即 32 字节)的哈希值。

工作原理

  1. 填充:输入的消息首先会被填充到特定的长度,使得消息长度对 512 取模后为 448。填充方法是先添加一个 1 位,然后再添加若干个 0 位。
  2. 附加长度:在填充后的消息末尾附加原始消息的长度(以 64 位表示)。
  3. 初始化哈希值:SHA-256 有 8 个初始哈希值,这些值是固定的常数。
  4. 消息分块处理:将填充并附加长度后的消息分成 512 位的块,对每个块进行一系列的逻辑运算和置换操作,更新哈希值。
  5. 输出结果:经过所有块的处理后,8 个哈希值拼接起来就形成了 256 位的最终哈希值。

应用场景

  1. 数字签名:确保消息的完整性和真实性。
  2. 密码存储:存储用户密码时不直接存储明文,而是存储其哈希值,增强安全性。
  3. 区块链:在区块链中用于构建区块的哈希,保证数据的不可篡改。

Base64

Base64 是一种基于 64 个可打印字符来表示二进制数据的编码方式,常用于在文本协议中传输二进制数据,比如在电子邮件、HTTP 协议中传输图片等二进制文件。

工作原理

  1. 分组:将待编码的二进制数据按每 3 个字节(共 24 位)为一组进行划分。
  2. 拆分:把每组 24 位数据拆分成 4 个 6 位的小组。
  3. 映射:每个 6 位小组的数值范围是 0 - 63,将其映射到 Base64 字符表中的一个字符。Base64 字符表包含大写字母 A - Z、小写字母 a - z、数字 0 - 9 以及+和/,共 64 个字符。
  4. 填充:如果最后一组不足 3 个字节,用=进行填充。

应用场景

  1. 邮件传输:在电子邮件中,用于传输图片、附件等二进制数据。
  2. URL 传输:在 URL 中传递二进制数据时,可先进行 Base64 编码,确保数据能正确传输。
  3. 配置文件:在配置文件中存储二进制数据,如密钥、证书等。

C/C++实现HMAC-SHA256

test.cpp

#include 
#include 
#include 
#include 

#include 
#include 
#include 
#include 


std::string base64Encode(const unsigned char *input, int length)
{
    BIO *bmem, *b64;
    BUF_MEM *bptr;

    // 创建内存BIO
    b64 = BIO_new(BIO_f_base64());
    bmem = BIO_new(BIO_s_mem());
    b64 = BIO_push(b64, bmem);
    BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL); // 不换行

    // 写入数据到BIO
    BIO_write(b64, input, length);
    BIO_flush(b64);

    // 获取编码后的数据
    BIO_get_mem_ptr(b64, &bptr);


    std::string ret = (char *)(bptr->data); // bptr->length
    // 释放BIO
    BIO_free_all(b64);

    return ret;
}


std::string hmacSha256Base64(const std::string &key, const std::string &data)
{
    unsigned int len = SHA256_DIGEST_LENGTH;
    unsigned char result[SHA256_DIGEST_LENGTH] = { 0 };
    HMAC(EVP_sha256(), (unsigned char *)(key.c_str()), key.size(), (unsigned char *)(data.c_str()), data.size(), result, &len);

    std::string ret = base64Encode(result, SHA256_DIGEST_LENGTH);
    return ret;
}

int main(int argc, char **argv)
{
    const char *key = "key";
    const char *data = "Hello";
    std::string out = hmacSha256Base64(key, data);
    std::cout << out << std::endl;

    return 0;
}

g++ test.cpp -lssl -lcrypto
./a.out
输出结果
xwufTWZb1il0r8g1gt6BDnKkGljbgsU4qdc0ySZtMh4=

相关文章

Python与Java实现hmacSha256+base64
HMAC-SHA1加密算法c++与java的实现
作者:帅得不敢出门

你可能感兴趣的:(C/C++,c语言,c++,开发语言,加解密,sha256,hmac,base64)