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就行。
    }
相关推荐
earthzhang20211 分钟前
《深入浅出HTTPS》读书笔记(5):随机数
网络协议·http·https
xiaoxiongip6664 分钟前
HTTP 和 HTTPS
网络·爬虫·网络协议·tcp/ip·http·https·ip
CXDNW10 分钟前
【网络面试篇】HTTP(2)(笔记)——http、https、http1.1、http2.0
网络·笔记·http·面试·https·http2.0
代码之光_198030 分钟前
保障性住房管理:SpringBoot技术优势分析
java·spring boot·后端
ajsbxi35 分钟前
苍穹外卖学习记录
java·笔记·后端·学习·nginx·spring·servlet
StayInLove1 小时前
G1垃圾回收器日志详解
java·开发语言
对许1 小时前
SLF4J: Failed to load class “org.slf4j.impl.StaticLoggerBinder“
java·log4j
无尽的大道1 小时前
Java字符串深度解析:String的实现、常量池与性能优化
java·开发语言·性能优化
羊小猪~~1 小时前
数据结构C语言描述2(图文结合)--有头单链表,无头单链表(两种方法),链表反转、有序链表构建、排序等操作,考研可看
c语言·数据结构·c++·考研·算法·链表·visual studio
小鑫记得努力1 小时前
Java类和对象(下篇)
java