C++ JAVA源码 HMAC计算 openssl 消息认证码计算 https消息防篡改 通信安全

签名和验签

把所有消息按顺序合并成一条信息,对这个信息用密钥进行签名。

签名信息通过 HTTP 头 Sign 传递,没有携带签名或者签名验证不通过的请求,将会被认为异常请求,并返回相应 code 码。

校验方法:根据 http请求的原始 Body 及请求头内参数等所有消息按顺序合并成一条信息 进行签名生成 sign。对自生成的 sign 与 传过来的Sign 做对比,相同则校验通过,反之则校验失败。

在线工具 https://www.lddgo.net/encrypt/hmac

C++代码验证

要在 C++ 中计算 HMAC-SHA256 的结果并将其转换为 Base64 输出,你可以结合 OpenSSL 库进行 HMAC 计算,并使用 Base64 编码函数来转换结果。下面是一个示例代码:

cpp 复制代码
#include <openssl/hmac.h>
#include <openssl/evp.h>
#include <openssl/buffer.h>
#include <iostream>
#include <string>

// Convert HMAC result to Base64
std::string base64_encode(const unsigned char* buffer, size_t length) {
    BIO* bio = BIO_new(BIO_f_base64());
    BIO* mem = BIO_new(BIO_s_mem());
    bio = BIO_push(bio, mem);

    // Do not use newlines to flush buffer
    BIO_set_flags(bio, BIO_FLAGS_BASE64_NO_NL);
    BIO_write(bio, buffer, length);
    BIO_flush(bio);

    BUF_MEM* mem_ptr;
    BIO_get_mem_ptr(bio, &mem_ptr);

    std::string base64_result(mem_ptr->data, mem_ptr->length);
    BIO_free_all(bio);

    return base64_result;
}

// Compute HMAC-SHA256 and encode result in Base64
std::string hmac_sha256_base64(const std::string& key, const std::string& message) {
    unsigned char* digest;
    unsigned int digest_len;

    digest = HMAC(EVP_sha256(),
                  key.c_str(), key.length(),
                  reinterpret_cast<const unsigned char*>(message.c_str()), message.length(),
                  nullptr, &digest_len);

    // Convert the HMAC digest to Base64
    return base64_encode(digest, digest_len);
}

int main() {
    std::string key = "your-key";        // Replace with your key
    std::string message = "your-message";  // Replace with your message

    std::string hmac_base64 = hmac_sha256_base64(key, message);

    std::cout << "HMAC-SHA256 (Base64): " << hmac_base64 << std::endl;

    return 0;
}

编译与运行

  1. 编译

    bash 复制代码
    g++ -o hmac_tool hmac_tool.cpp -lssl -lcrypto
  2. 运行

    bash 复制代码
    ./hmac_tool

代码解释:

  • HMAC Calculation : 使用 HMAC 函数来计算 HMAC-SHA256,结果保存在 digest 中。
  • Base64 编码 : 使用 OpenSSL 的 BIO 来进行 Base64 编码。BIO 是 OpenSSL 中用于处理数据流的结构。
  • BIO_f_base64BIO_s_mem : 分别用于创建 Base64 过滤器和内存 BIO。BIO_push 将它们连接在一起,使数据能够经过 Base64 编码后存储在内存中。
  • BIO_flush : 确保所有数据都已写入 BIO
  • base64_encode 函数: 将 digest 转换为 Base64 字符串并返回。

运行程序后,它将输出 HMAC-SHA256 结果的 Base64 编码版本。

java

java 复制代码
public static String HMACSHA256(String data, String key) throws Exception {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));

        return Base64.getUrlEncoder().encodeToString(array); //这里不要用urlEncoder,以免c++没有对应的库 对Hmac转base64就行。
    }
相关推荐
axng pmje1 天前
Java语法进阶
java·开发语言·jvm
汉克老师1 天前
GESP2025年3月认证C++五级( 第三部分编程题(1、平均分配))
c++·算法·贪心算法·排序·gesp5级·gesp五级
rKWP8gKv71 天前
Java微服务性能监控:Prometheus与Grafana集成方案
java·微服务·prometheus
老前端的功夫1 天前
【Java从入门到入土】28:Stream API:告别for循环的新时代
java·开发语言·python
qq_435287921 天前
第9章 夸父逐日与后羿射日:死循环与进程终止?十个太阳同时值班的并行冲突
java·开发语言·git·死循环·进程终止·并行冲突·夸父逐日
小江的记录本1 天前
【Kafka核心】架构模型:Producer、Broker、Consumer、Consumer Group、Topic、Partition、Replica
java·数据库·分布式·后端·搜索引擎·架构·kafka
yaoxin5211231 天前
397. Java 文件操作基础 - 创建常规文件与临时文件
java·开发语言·python
极客先躯1 天前
高级java每日一道面试题-2025年11月24日-容器与虚拟化题[Dockerj]-runc 的作用是什么?
java·oci 的命令行工具·最小可用·无守护进程·完全标准·创建容器的核心流程·runc 核心职责思维导图
用户60648767188961 天前
AI 抢不走的技能:用 Claude API 构建自动化工作流实战
java
我命由我123451 天前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime