aliyun Rest ful api V3版本身份验证构造

aliyun Rest ful api V3版本身份验证构造

参考官网:https://help.aliyun.com/zh/sdk/product-overview/v3-request-structure-and-signature?spm=a2c4g.11186623.0.0.787951e7lHcjZb
构造代码 :使用GET请求进行构造,算法使用sha256 使用postman进行验证
代码如下,linux环境运行,先安装openssl库:

#include <iostream>
#include <sstream>
#include <iomanip>
#include <cstring>
#include <random>
#include <chrono>
#include <cctype>
#include <iomanip>
#include <openssl/hmac.h>
#include <openssl/sha.h>
// HMAC-SHA256 calculation using OpenSSL library
//build,在Linux下编译 :  g++ -o a.out awsSignature.cpp -std=c++11 -lssl -lcrypto
std::string HMAC_SHA256(const std::string& key, const std::string& data) {
    unsigned char result[EVP_MAX_MD_SIZE];
    unsigned int result_len;

    HMAC(EVP_sha256(), key.c_str(), key.length(),
         reinterpret_cast<const unsigned char*>(data.c_str()), data.length(),
         result, &result_len);

    std::stringstream ss;
    for (unsigned int i = 0; i < result_len; i++) {
        ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(result[i]);
    }

    return ss.str();
}
// AWS Signature Version 4 calculation
std::string CalculateAWSV4Signature(const std::string& secretAccessKey, const std::string& region,
                                    const std::string& service, const std::string& timestamp,
                                    const std::string& payloadHash, const std::string& canonicalRequest) {
    // Step 1: Derive signing key
    std::string kDate = HMAC_SHA256("AWS4" + secretAccessKey, timestamp.substr(0, 8));
    std::string kRegion = HMAC_SHA256(kDate, region);
    std::string kService = HMAC_SHA256(kRegion, service);
    std::string kSigning = HMAC_SHA256(kService, "aws4_request");

    // Step 2: Calculate signature
    std::string stringToSign = "AWS4-HMAC-SHA256\n" + timestamp + "\n" + timestamp.substr(0, 8) +
                               "/" + region + "/" + service + "/aws4_request\n" + HMAC_SHA256(kSigning, canonicalRequest + "\n" + payloadHash);
    std::string signature = HMAC_SHA256(kSigning, stringToSign);

    return signature;
}

std::string calculateHash(const std::string& data) {
    unsigned char hash[SHA256_DIGEST_LENGTH];

    SHA256_CTX sha256;
    SHA256_Init(&sha256);
    SHA256_Update(&sha256, data.c_str(), data.length());
    SHA256_Final(hash, &sha256);

    std::stringstream ss;
    for (int i = 0; i < SHA256_DIGEST_LENGTH; i++) {
        ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(hash[i]);
    }
    return ss.str();
}
std::string CanonicalizeRequest(const std::string& HTTPMethod, const std::string& CanonicalUri, const std::string& CanonicalQueryString, const std::string& CanonicalHeaders, const std::string& SignedHeaders, const std::string& payload)
{
		std::string canonicalize_string= HTTPMethod + "\n" +
		"/"+CanonicalUri + "\n" +
		CanonicalQueryString + "\n" +
		CanonicalHeaders + "\n" +
		SignedHeaders + "\n" +
		payload;
		return canonicalize_string;
}
std::string generateSignatureNonce() {
    // 使用 std::random_device 获取真正的随机数种子
    std::random_device rd;

    // 使用 std::mt19937 作为伪随机数生成器引擎
    std::mt19937 gen(rd());

    // 使用 std::uniform_int_distribution 来生成范围内的随机数
    std::uniform_int_distribution<> dis(0, 999999);

    // 生成随机数
    int nonceValue = dis(gen);

    // 将随机数转换为字符串
    std::ostringstream oss;
    oss << nonceValue;

    return oss.str();
}
std::string GetDate(int t){
	std::chrono::system_clock::time_point now_time = std::chrono::system_clock::now();
	std::time_t now_t = std::chrono::system_clock::to_time_t(now_time);
    std::tm gm_time = *std::gmtime(&now_t);
    char buf[128];
	if(t==1)
		std::strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S GMT", &gm_time);
	else
	{
		std::strftime(buf, sizeof(buf), "%FT%TZ", &gm_time);
	}
		
	std::string time(buf);
	return time;
}

std::string UrlEncode(std::string& url){
	std::ostringstream encoded;
    encoded << std::hex << std::uppercase << std::setfill('0');

    for (char ch : url) {
        if (std::isalnum(ch) || ch == '-' || ch == '_' || ch == '.' || ch == '~') {
            // 字母数字字符和"- _ ."波浪符号保持不变
            encoded << ch;
        } else {
            // 其他字符进行百分号编码
            encoded << '%' << std::setw(2) << static_cast<int>(static_cast<unsigned char>(ch));
        }
    }

    return encoded.str();
}
int main() {
    // AWS credentials and request details
    std::string accessKeyId = "你们密钥id";
    std::string secretAccessKey = "你的密钥";
    std::string region = "cn-shanghai";
    std::string param = "RegionId";
	std::string version="2014-05-26";
    std::string timestamp =GetDate(2);
	std::cout<<"timestamp: "<<timestamp<<std::endl;
    std::string canonicalRequest = "";
	std::string GMTime=GetDate(1);//GMT=1
	std::cout<<"GMTime"<<GMTime<<std::endl;
	//规范化请求构建参数
	std::string signature_nonce=generateSignatureNonce();
	std::cout<<signature_nonce<<std::endl;
	std::string HTTPRequestMethod="GET";
	std::string CanonicalURI ="";
	std::string CanonicalQueryString=UrlEncode(param)+"="+UrlEncode(region);//升序 url编码
	std::string CanonicalHeaders="host:ecs.cn-shanghai.aliyuncs.com\nx-acs-action:DescribeInstances\nx-acs-content-sha256:e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855\nx-acs-date:"+timestamp+"\nx-acs-signature-nonce:"+signature_nonce+"\nx-acs-version:"+version+"\n";
	std::string SignedHeaders="host;x-acs-action;x-acs-content-sha256;x-acs-date;x-acs-signature-nonce;x-acs-version";
	std::string HashedRequestPayload="e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855";
	//获取规范化请求值
	std::string CanonicalRequestString=CanonicalizeRequest(HTTPRequestMethod,CanonicalURI,CanonicalQueryString,CanonicalHeaders,SignedHeaders,HashedRequestPayload);
	std::cout<<CanonicalRequestString<<std::endl;
	//计算规范化请求的hash值
	std::string hashCanonicalRequest=calculateHash(CanonicalRequestString);
	std::string StringToSign="ACS3-HMAC-SHA256\n"+hashCanonicalRequest;

	//. 计算signature
	std::string signature = HMAC_SHA256(secretAccessKey,StringToSign);
    std::cout << "signature: " << signature << std::endl;
    return 0;
}

然后打开postman:
在这里插入图片描述
将算出来的信息在这里赋值,包含唯一随机数、时间、还有signature
在这里插入图片描述
然后 over
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/147867.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

mq具体使用方式

代码方式 第一步方式导入依赖的方式 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--AMQP依赖&#xff0c;包含RabbitMQ--><…

【numpy】数据类型

1、Numpy Python 的扩展库&#xff08;数学函数库&#xff09;&#xff0c;主要用于数组计算。 N维数组对象ndarray广播功能函数整合C/C/Fortran代码的工具线性代数、傅里叶变换、随机数生成等功能 通常与SciPy&#xff08;开源算法库和数学工具包&#xff09;和Matplotlib&a…

无人零售:创新优势与广阔前景

无人零售&#xff1a;创新优势与广阔前景 无人零售在创新方面具有优势。相比发展较为成熟的欧洲和日本的自动贩卖机市场&#xff0c;中国的无人零售市场人均占有量较少&#xff0c;这表明该市场具有广阔的前景和巨大的市场潜力。 此外&#xff0c;无人零售涉及到许多相关行业&…

数据结构笔记:R树

R-trees: a dynamic index structure for spatial searching 1984 1 介绍 R树可以看作B树再高维空间的扩展。它很好的解决了在高维空间搜索等问题。 采用了B树分割空间的思想&#xff0c;并在添加、删除操作时采用合并、分解结点的方法&#xff0c;保证树的平衡性R树就是一棵…

塑料橡胶工厂数字孪生可视化管理平台建设,推动制造业智慧数字化转型

中国制造业正面临向数字化、智能化转型的关键时期&#xff0c;到2035年规模以上制造业企业全面普及数字化、网络化&#xff0c;智能化&#xff0c;推动制造业数字化战略转型已迫在眉睫。加快5G、数字孪生、人工智能等新一代信息技术与塑料橡胶产业融合&#xff0c;不断增强塑料…

leetcode做题笔记1334. 阈值距离内邻居最少的城市

有 n 个城市&#xff0c;按从 0 到 n-1 编号。给你一个边数组 edges&#xff0c;其中 edges[i] [fromi, toi, weighti] 代表 fromi 和 toi 两个城市之间的双向加权边&#xff0c;距离阈值是一个整数 distanceThreshold。 返回能通过某些路径到达其他城市数目最少、且路径距离…

「题解」相交链表

&#x1f349;题目 题目链接 &#x1f349;解析 “提示”部分有提示链表数不为零&#xff0c;所以讨论链表为空的情况。 最简单粗暴的思路就是&#xff1a;遍历链表&#xff0c;先使用循环遍历A链表&#xff0c;然后嵌套循环遍历B&#xff0c;比对A、B是否存在地址相同的…

JSP注释方式演示 讲解显式与隐式注释

好 今天我们来了解一下jsp中的注释哦 它支持两种注释: 显式注释/隐式注释 显式注释 是 允许被客户端看到的 就是 打开浏览器 用查看源码方式能看到的注释 与之对应 隐式注释 就是 在客户端 是无法看到这些注释信息的 显式注释 的语法就是html的注释语法 <!-- 显式注释 --…

文生图超级大合集!几乎包含所有模型,提示词教程

除了DALLE 3、Midjourney、Stable Difusion&#xff0c;你还知道哪些好用小众的文生图模型吗&#xff1f; 你知道一张精美的AI图片&#xff0c;需要哪些精准的提示词、效果融合以及制作流程吗&#xff1f; 如果把几乎所有文生图模型集合在一个平台中&#xff0c;并且还能叠加…

小波神经网络的时间序列预测——短时交通流量预测

大家好&#xff0c;我是带我去滑雪&#xff01; 小波神经网络&#xff08;Wavelet Neural Network&#xff0c;WNN&#xff09;结合了小波变换和神经网络的特性&#xff0c;是一种在信号处理和模式识别领域应用广泛的神经网络模型。它的设计灵感来自于小波变换的多尺度分析特性…

pyCharm新建项目

1.新建界面点击Create New Project。 或点击File->New Project... 2.选择Pure Python后&#xff0c;如图选择路径。 Location的地址一致&#xff0c;点击Create。 3.等待新建成功后&#xff0c;在新建的项目名字右击&#xff0c;如下图可以选择新建文件夹、python包和python…

信息检索与数据挖掘 | 【实验】检索评价指标MAP、MRR、NDCG

文章目录 &#x1f4da;实验内容&#x1f4da;知识梳理&#x1f4da;实验步骤&#x1f407;前情提要&#x1f407;MAP评价指标函数&#x1f407;MRR 评价指标函数&#x1f407;NDCG评价指标函数&#x1f407;调试结果 &#x1f4da;实验内容 实现以下指标评价&#xff0c;并对…

Acrobat Pro DC 2023 中文版

Acrobat Pro DC 2023是PDF编辑和管理软件&#xff0c;具有以下优点&#xff1a; 更好的安全性&#xff1a;Acrobat Pro DC 2023采用了新的安全功能&#xff0c;包括加密、数字签名等&#xff0c;可以更好地保护PDF文件的安全性。 更高的速度和性能&#xff1a;Acrobat Pro DC …

OpenCV入门——图像视频的加载与展示一些API

文章目录 OpenCV创建显示窗口OpenCV加载显示图片OpenCV保存文件利用OpenCV从摄像头采集视频从多媒体文件中读取视频帧将视频数据录制成多媒体文件OpenCV控制鼠标关于[np.uint8](https://stackoverflow.com/questions/68387192/what-is-np-uint8) OpenCV中的TrackBar控件TrackBa…

Python小白之PyCharm仍然显示“No module named ‘xlwings‘”

Python小白之“没有名称为xlwings‘的模块”-CSDN博客文章浏览阅读8次。cmd 打开命令行&#xff0c;输入python出现>>>的提示格&#xff0c;输入import xlwings 回车&#xff0c;正常报错&#xff1a;No module named xlwings。输入python 回车后&#xff0c;再输入im…

黑客帝国中的黑客如何隐藏自己的IP,你不可不知的正向代理和反向代理

文章目录 前言正向代理常用使用场景VPN动态 IP 代理隐藏客户端 IP 反向代理使用场景堡垒机nginx 负载均衡 动态 IP 代理实现分类按匿名分类按成本分类按协议分类 原理nodeJs 简单实现 总结个人简介 前言 hello&#xff0c;大家好&#xff0c;我是 Lorin &#xff0c;今天给大家…

c# 字符串转化成语音合成,System.Speech

C# 语音合成可以使用 System.Speech.Synthesis 命名空间中的 SpeechSynthesizer 类来实现。SpeechSynthesizer 类提供了一系列方法和属性&#xff0c;可以用来控制语音合成的过程&#xff0c;包括设置语音、音调、语速等。 下面是一个简单的示例&#xff0c;用来演示如何使用 …

SpringBoot写接口小记 以及 几个层的功能总结(自用 勿喷)

目录 Entity层&#xff1a;实体层 数据库在项目中的类 Mapper层&#xff1a; 持久层 主要与数据库进行交互 Service层&#xff1a;业务层 控制业务 Controller层&#xff1a;控制层 控制业务逻辑 Entity层&#xff1a;实体层 数据库在项目中的类 Entity层是实体层&#xff…

WP光电信息学院2023年网络安全季度挑战赛-测试赛

签个到就跑WP Misc MISC-没爱了&#xff0c;下一个 下载附件压缩包解压之后&#xff0c;获得一个流量包文件 使用wireShark打开流量包&#xff0c;Ctrl F 搜索flag{即可获得flag flag{Good_b0y_W3ll_Done}MISC-送你一朵小花花 下载附件压缩包解压之后&#xff0c;获得一…