cos签名-xml接口-算法实现

遇到的问题之dotnet腾讯COS生成临时凭证 情况:腾讯COS上传文件,asp.net项目。开始是这样处理的:前端上传文件到后台,后台再上传到COS,一开始考虑的是统一管理,这时候用的也是永久的id和key。部署的时候因为服务器流量成本增加的原因,需要前端直接上传文件到COS,安全考虑,需要后台动态生成临时密钥。 官网文档中介绍了两种获取方式: 方式2有点复杂就没继续看。 主要记录下方式1在使用中遇到的问题。 运行COS STS SDK的demo没问题,然后在asp.net项目中运行的时候,导致整个程序不响应了。 1.COS STS SD 阅读详情

COS签名

腾讯云cos xml接口签名文档

代码

Auth.h
    /// @brief 返回cos_xml接口的签名
    ///        腾讯云签名文档:https://qcloud.com/document/product/436/7778
    /// @param app_id       项目的app_id
    /// @param secret_id    签名秘钥id,可在控制台获得
    /// @param secret_key   签名秘钥,可在控制台获得
    /// @param expired_time 签名文档中q_key_time,q_sign_time有效时间
    /// @param uri          签名秘钥id,可在控制台获得
    /// @param bucket_name  bucket名字,可在控制台获得
    /// @param op           HTTP操作GET、PUT
    /// @param user_params  用户参数
    /// @param user_headers http头部
    /// @return string 签名,可用于访问cos的xml接口
    static std::string AppSignXml(uint64_t app_id,
                        const std::string& secret_id,
                        const std::string& secret_key,
                        uint64_t expired_time,
                        const std::string& uri,
                        const std::string& bucket_name,
                        const std::string& op,
                        const std::map<string,string>& user_params,
                        const std::map<string,string>& user_headers);



Auth.cpp

// 腾讯云签名算法文档:https://qcloud.com/document/product/436/7778
std::string Auth::AppSignXml(uint64_t app_id,
                        const std::string& secret_id,
                        const std::string& secret_key,
                        uint64_t expired_time,
                        const std::string& uri,
                        const std::string& bucket_name,
                        const std::string& op,
                        const std::map<string,string>& _user_params,
                        const std::map<string,string>& _user_headers)
{

    // 将params和headers的key都转成小写(方便字典序排序)
    string key,value;
    std::map<string,string> user_params;
    for(std::map<string, string>::const_iterator it = _user_params.begin();
            it != _user_params.end(); ++it) {
        key = CodecUtil::ToLower(it->first);
        value = it->second;
        user_params[key] = value;
    }
    std::map<string,string> user_headers;
    for(std::map<string, string>::const_iterator it = _user_headers.begin();
            it != _user_headers.end(); ++it) {
        key = CodecUtil::ToLower(it->first);
        value = it->second;
        user_headers[key] = value;
    }

    // step 1: calc Signkey
    char q_key_time[30];                    //key有效时间
    uint64_t time_s = time((time_t*)NULL);  //time返回10位unix时间,单位s
    snprintf(q_key_time, 30,
#if __WORDSIZE == 64
            "%lu;%lu",
#else
            "%llu;%llu",
#endif
            time_s, time_s + expired_time);
    string sign_key = CodecUtil::HmacSha1(q_key_time, secret_key);
    string sign_key_str = CodecUtil::HexToStr(sign_key);
#ifdef SIGN_DEBUG
    std::cout<< "***********************************************" << std::endl;
    std::cout<< "**********q_key:" << q_key_time << std::endl;
    std::cout<< "**********sign_key_str:\n" << sign_key_str <<std::endl;
#endif

    // step 2: get FormatString
    string format_str;
    // operation
    format_str += CodecUtil::ToLower(op);
    format_str += "\n";
    // uri
    format_str += CodecUtil::UrlEncode(uri);
    format_str += "\n";
    // user_params
    string params_key, params_value, param_str;
    for(std::map<string, string>::const_iterator it = user_params.begin();
            it != user_params.end(); ) {
        params_key = it->first;
        params_value = it->second;
        param_str = CodecUtil::ToLower(CodecUtil::UrlComponentEncode(params_key))
            + "=" + CodecUtil::UrlComponentEncode(params_value);
        format_str += param_str;
        ++it;
        if(it != user_params.end())
            format_str += "&";
    }
    format_str += "\n";

    //user_headers
    string header_key, header_value, header_str;
    for(std::map<string, string>::const_iterator it = user_headers.begin();
            it != user_headers.end(); ) {
        header_key = it->first;
        header_value = it->second;
        header_str = CodecUtil::ToLower(CodecUtil::UrlComponentEncode(header_key))
            + "=" + CodecUtil::UrlComponentEncode(header_value);
        format_str += header_str;
        ++it;
        if(it != user_headers.end())
            format_str += "&";
    }
    format_str += "\n";
    string sha1_format_str = CodecUtil::GetFileSha1(format_str.c_str(),format_str.length());
#ifdef SIGN_DEBUG
    std::cout<< "**********format_str:\n" << format_str <<std::endl;
    std::cout<< "**********sha1_format_str:\n" << sha1_format_str <<std::endl;
#endif

    // step 3: get StringToSign
    char q_sign_time[30];   //sign有效时间(key有效时间一般大于或等于sign有效时间)
    strcpy(q_sign_time, q_key_time);
    string str2sign;
    str2sign += "sha1\n";
    str2sign += q_sign_time;
    str2sign += "\n";
    str2sign += sha1_format_str;
    str2sign += "\n";
#ifdef SIGN_DEBUG
    std::cout<< "**********str2sign:\n" << str2sign <<std::endl;
#endif
    // step 4: calc signature
    string signature = CodecUtil::HmacSha1(str2sign, sign_key_str);
    string signature_str = CodecUtil::HexToStr(signature);

    // step5: get Authorization
    string auth;
    auth += "q-sign-algorithm=sha1";
    auth += "&q-ak=";
    auth += secret_id;
    auth += "&q-sign-time=";
    auth += q_sign_time;
    auth += "&q-key-time=";
    auth += q_key_time;
    auth += "&q-header-list=";      //需要检查的header_key,字典序排列
    // auth += "host;range";
    for(std::map<string, string>::const_iterator it = user_headers.begin();
            it != user_headers.end(); ) {
        auth += CodecUtil::ToLower(it->first);
        ++it;
        if(it != user_headers.end())
            auth += ";";
    }
    auth += "&q-url-param-list=";   //需要检查的param_key,字典序排列
    for(std::map<string, string>::const_iterator it = user_params.begin();
            it != user_params.end(); ) {
        auth += CodecUtil::ToLower(it->first);
        ++it;
        if(it != user_params.end())
            auth += ";";
    }
    auth += "&q-signature=";
    auth += signature_str;
#ifdef SIGN_DEBUG
    std::cout<< "**********auth:\n" << auth <<std::endl<<std::endl;
    std::cout<< "***********************************************" << std::endl;
#endif

    return auth;
}


测试demo

请到腾讯云申请对象存储帐号,控制太获取参数填到对应位置,Make编译,curl命令运行。

int main(){

    // 腾讯云示例:
    //     SecretKey: AKIDZfbOA78asKUYBcXFrJD0a1ICvR98JM
    //     SecretID: QmFzZTY0IGlzIGEgZ2VuZXJp
    //     测试使用的 Bucket 是在中国华北地区的 testbucket,建立在开发商 AppID 为 125000000 的账户下

    // GET Object 示例:
    //     以下示例内容展示了一个 GET Object 操作的签名示例,
    //     地址是 http://testbucket-125000000.cn-north.myqcloud.com/testfile 
    //     并通过 Range 参数请求该文件的前 4 个字节。

    // GET 请求:
    //     GET /testfile HTTP/1.1
    //     Host: testbucket-125000000.cn-north.myqcloud.com
    //     Range: bytes=0-3

    //重要的事情说三遍
    //这些默认参数是腾讯云给的,但是key和id只是演示,并不能通过cos的验证。请填写自己申请的腾讯云帐号的参数
    //这些默认参数是腾讯云给的,但是key和id只是演示,并不能通过cos的验证。请填写自己申请的腾讯云帐号的参数
    //这些默认参数是腾讯云给的,但是key和id只是演示,并不能通过cos的验证。请填写自己申请的腾讯云帐号的参数
    uint64_t app_id = 125000000;//填写自己的腾讯云appid
    string secret_key = "AKIDZfbOA78asKUYBcXFrJD0a1ICvR98JM";  //填写自己的SecretKey,cos控制台查看
    string secret_id = "QmFzZTY0IGlzIGEgZ2VuZXJp";   //填写自己的Secretid,cos控制台查看
    uint64_t expired_time = 10000;
    string bucket_name = "testbucket"; // bucket名称
    string uri = "/testfile";        //cos上面bucket下面的object路径,以/开始
    string op = "GET";
    map<string,string> user_params;
    map<string,string> user_headers;
    //填写host:<bucket_name>-<app_id>.<region>.myqcloud.com
    user_headers["Host"]="testbucket-125000000.cn-north.myqcloud.com";
    user_headers["Range"]="bytes=0-3";

    string auth1 = qcloud_cos::Auth::AppSignXml(app_id, secret_id, secret_key, 
        expired_time, uri, bucket_name, op, user_params, user_headers);

    cout << auth1 <<endl<<endl;
    cout<< "curl -v http://" + user_headers["Host"] + uri +" "\
        "-H \"Accept:*/*\" -H \"Range:" + user_headers["Range"] + "\" -H \"User-Agent:curl/7.29.0\" "\
        "-H \"Authorization:" << auth1 << "\"" <<endl;

    return 0;
}


生成的curl命令,直接在命令行请求,可以获取到数据。

完整源码:点击打开链接

网银新一代液晶按键USBkey安全分析 网上银行由于其方便性,已经成为人们日常生活中经常使用的平台,银行用户可以不出家门,就可以通过互联网完成支付、转帐、交费等众多业务,省去了银行排队,携带大量现金等即费时繁琐,又不安全的原始业务形式。 随着网银业务的广泛普及,网银的安全性也是大家非常关注的一个问题。简单的用户名/密码方式已经被屏弃淘汰,取而代之的是十分安全的PKI数字证书认证体系,该体系主要通过数字证书中的RSA非对称密钥完成数据传 阅读详情

相关推荐

WPS在线编辑对接实战:避坑指南与核心问题解析

在线文档编辑与协同办公已成为现代企业提升效率的关键技术。其核心原理在于通过云端服务将文档处理能力嵌入Web应用,实现多用户实时或异步协作。这项技术的价值在于打破了办公软件的地域和设备限制,极大地促进了团队的信息流转与共创。典型的应用场景包括在线合同审批、团队项目文档协作、教育领域的作业批改等。在实际工程实践中,与WPS这类第三方服务的对接,常会遇到文件格式兼容性、用户权限同步、回调接口安全等挑战。本文聚焦于WPS在线编辑对接中的文件处理与权限控制等关键环节,通过剖析文件健康性检查、动态权限生效机制等具体问题

weixin_33749131的博客 377

腾讯云Cos获取签名并通过签名上传文件

项目中有个需求,需要把文件传到腾讯云cos存储,还没开始前先去腾讯云上面,赶紧申请一个试试看,之前用过微软云blob存储,整体而言都差不多,就是一个文件夹吧,通过api把文件传上去就ok了.先去申请cos 的使用,然后申请一个桶 这个桶 的概念 类似于计算机上面的 磁盘点击进去后就可以看到 文件 和文件夹,这些都是测试的时候上传的文件既可以通过这个web页面上传,也可以通过api 上传,当前肯定是...

翻身了,咸鱼! 1万+

(三)使用.NET Core3.1和EF Core构建RESTful API

在本文中,我将演示如何使用ASP.NET Core 3.1构建RESTful Web API,使用Entity Framework Core与现有数据库连接,创建JWT令牌提供对API访问的保护权限。如果您不熟悉.NET Core,可以先阅读我的.NET Core 3.1简介。 这篇文章的各节如下: 什么是RESTful API? 什么是JWT令牌? 添加控制器和脚手架构建RESTful API 使用Postman测试API接口 使用Cors解决前端调用API跨域的问题 创建一个JWT令牌保.

ananlele_的专栏 2110

腾讯云COS云对象存储,分布式解决签名上传

看看就会的云对象存储

m0_57249797的博客 1319

Node.js项目直连腾讯云COS的v5版SDK(XML协议底层,含STS分片上传示例)

专为Node.js后端或服务端直传场景打造的腾讯云对象存储COS官方SDK v5,基于原生XML API协议构建,不依赖JSON API抽象层。开箱即用支持Bucket创建与管理、对象PUT/GET/DELETE、带进度监听的流式上传下载、大文件分片上传(含断点续传逻辑)、服务端签名生成、跨域CORS配置、内容安全策略CSP兼容处理。内置CRC64校验、异步任务队列、会话上下文管理、完整TypeScript类型定义(index.d.ts)和事件回调机制。提供6类典型使用示例:基础上传(demo.js)、ST

tgb3456789的博客 303

cos-xml-auth

腾讯云cos签名算法实现及测试demo。 https://qcloud.com/document/product/436/7778

如何优雅地使用腾讯云COS-.NET篇

如何优雅地使用腾讯云COS-.NET篇 代码下载地址 https://github.com/whuanle/txypx20190809 前提 创建子账号 打开 https://console.cloud.tencent.com/cam 创建子用户,设置子账号策略为 AdministratorAccess ,或者参考https://cloud.tencent.com/document/pr...

weixin_30795127的博客 740

Unity3D COSXML腾讯云数据库

资源放到unityPlugins里面即可

Unity接入 阿里云OSS 腾讯云Cos的SDK,实现上传文件功能

概念 Bucket(存储空间):Bucket是用户用来管理所存储Object的存储空间。每个用户可以拥有多个Bucket。Bucket的名称在OSS的范围内必须是全局唯一的,一旦创建之后无法修改名称。Bucket内部的Object数目是没有限制 Object(对象,文件):Object是OSS存储数据的基本单元,称为OSS的对象,也被称为OSS的文件 Bucket命名规范: 1,只能包括小写字母,数字和短横线(-) 2,必须以小写字母或者数字开头 3,长度必须在3-63字节之间 Object命名规范: 1,

weixin_44806700的博客 4565

腾讯云COS集成实例(我是凑字数的,优快云为啥名称非要11个字?)

本demo集成了腾讯云的COS服务,案例中有详细的文件和目录操作方法

深入解析STM32官方库:.c/.h文件功能与应用场景

本文深入解析了STM32官方库中.c和.h文件的核心功能与应用场景。详细剖析了stm32f10x.h、启动文件、外设驱动文件等关键组件的作用,并通过LED闪烁实战演示了如何构建工程、配置文件和调用库函数。文章旨在帮助开发者理解官方库的架构,掌握高效使用技巧,从而降低STM32开发门槛,提升开发效率与代码质量。

weixin_29189377的博客 355

腾讯云对象存储 python_腾讯云对象存储(COS)服务的 API

注意:此文档仅适用于 COS XML 版本,版本可登陆后在 COS 控制台首页查看。此文档不适用于 POST object 的 HTTP 请求。使用对象存储服务 COS 时,可通过 RESTful API 对 COS 发起 HTTP 匿名请求或 HTTP 签名请求,对于签名请求,COS 服务器端将会进行对请求发起者的身份验证。匿名请求:HTTP 请求不携带任何身份标识和鉴权信息,通过 RESTfu...

weixin_35621884的博客 1373

Leaflet 加载天地图完整配置指南:从插件修改到无限缩放(附源码)

本文详细介绍了Leaflet与天地图深度集成的完整配置指南,包括插件修改、无限缩放实现及源码示例。通过解析天地图服务的WMTS协议、双投影支持和密钥机制,帮助开发者突破缩放级别限制,优化地图应用性能,适用于Web地图开发和高精度GIS系统。

weixin_27180827的博客 441

【亲测免费】 探索腾讯云COS JS SDK v5:新一代Web存储解决方案

,这是一个轻量级的JavaScript库,让你在浏览器端轻松实现文件上传、下载及其他相关操作。 ## **项目简介** COS JS SDK v5是专为现代Web应用设计的,它支持多种前端框架,并且兼容大部分现代浏览器。此SDK的核心目标是提供一个简单易用的API接口,使得开发者无需关注底层复杂的网络通信细节,就能高效地进行云存储操作。 ## **技术分析** ### **模块化设计** ...

gitblog_00053的博客 854

STC15单片机双串口通信实战:串口2配置与多设备交互

本文详细介绍了STC15单片机双串口通信的实战配置,重点解析串口2的硬件连接、寄存器设置及多设备交互实现。通过实际项目案例和完整代码示例,帮助开发者快速掌握STC15串口2的配置技巧,解决常见通信问题,提升嵌入式系统开发效率。

weixin_29174013的博客 256

libnice和coturn这两个库有交叉实现的地方,具体有啥区别?

TurnAdmin:是一个TURN的管理工具,此工具能被用来管理用户账号的增删改查。 TurnServer:是TURN和STUN的服务器实现。 Turnutils_uclient: 模拟多个UDP、TCP、TLS或DTLS客户端 Turnutils_peer: 一个简单的无状态UDP-ECHO服务器,用作中继模式中的最终服务器 Turnutils_stunclient: 一个简单的STUN客户端例子 Turnutils_rfc5769check: 检查STUN/TURN协议实现的正确性。 我们..

Langeldep的专栏 1319

腾讯云 cos ajax,腾讯云 COS JS SDK(JSON API)

cos-js-sdk-v4已弃用 - 请升级到 cos-js-sdk-v5SDK 依赖的 JSON API 已弃用,请直接使用基于 XML API 的 cos-js-sdk-v5。腾讯云 COS JS SDK(JSON API)前期准备使用SDK需要浏览器支持HTML 5请您到https://console.cloud.tencent.com/cos 获取您的项目ID(appid),bucket,...

weixin_33158363的博客 686

【汽车ECU电控数据管理篇】A2L文件在ECU标定中的关键作用与实战解析

本文深入解析A2L文件在汽车ECU标定中的关键作用,详细介绍了其作为'数据字典'的核心功能与实战应用。通过剖析A2L文件的结构、关键标签及常见问题,帮助工程师高效管理电控数据,提升ECU标定效率与准确性。文章特别强调了ASAP2标准下的A2L文件在汽车电控系统中的重要性。

a3b4c5的博客 789

【企业级Web应用中的文件下载处理:从S3预签名URL到压缩状态管理】

文件状态管理至关重要在数据模型中明确文件处理状态前端需根据状态执行不同逻辑预签名URL机制需谨慎使用生成时机应在文件确实可用后需考虑URL过期情况要处理S3错误响应异步任务与状态同步大文件处理应异步进行状态变更需及时通知前端考虑引入事件驱动架构防御性编程不可或缺前端需检查文件状态处理各种错误场景提供友好的用户反馈上述经验不仅适用于S3预签名URL下载场景,也适用于各种涉及文件处理的企业应用。通过合理的架构设计和状态管理,可以显著提升文件处理功能的可靠性和用户体验。

weixin_37342647的博客 1939

【IxNetwork】史上最全IxNetwork测试仪使用精讲(一),图文教程超赞超详细!!!

IXIA使用的是Server-client模式,Server端在测试仪表的主机上,在开机后会随着主机内的操作系统的启动而自动启动,一般情况下不需要人为的手工启动。因此在通常不需要为主机配置专用的显示器和键盘。client端包括两个测试软件: Ixia Explorer和ScriptMate。这两个软件一般安装在测试用计算机上,在仪表自带的主机中也有这两个软件。根据测试项目的不同来选择使用不同的软件。Ixia Explorer主要提供数据流的测试,针对设备的功能进行测试;

风云说通信 2056

视觉Transformer实战 | Transformer详解与实现

本文系统介绍了 Transformer 架构的核心原理与实现。相比传统 RNN 和 CNN,Transformer 凭借自注意力机制有效捕捉序列中的长距离依赖关系,支持并行训练,显著提升效率。其核心创新在于通过查询、键、值向量计算注意力权重,理解单词间的语义关联。架构包含编码器-解码器结构:编码器通过多头自注意力和前馈网络提取输入特征;解码器利用掩码自注意力和交叉注意力生成输出。本文使用 PyTorch 实现了缩放点积注意力、位置编码、层归一化等关键模块,并构建了完整的 Transformer 模型。

盼小辉丶的博客 4万+

存储桶学习

存储桶是对象的载体,是用来存放对象的容器,容量无上限,且没有文件夹和目录存储桶可以存放任意二进制文件数据,上传的每一份文件或者二进制数据都被称为"对象"可存放的数据入:图片,音视频,文档文件,二进制数据,网站代码等....

2401_87218271的博客 249

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SpringBoot集成QQ登录与JWT鉴权视频播放接口实战

OAuth2.0是一种开放授权标准,其核心原理是通过授权码模式,在用户不提供密码的情况下,让第三方应用获取用户资源的有限访问权限。这一机制在技术上的价值在于实现了安全的单点登录和用户身份联邦,极大地简化了用户注册流程并提升了用户体验。在工程实践中,OAuth2.0被广泛应用于第三方登录集成场景,例如国内常见的QQ、微信登录。本文聚焦于**Spring Security OAuth2 Client**这一强大框架,它封装了复杂的授权流程,开发者只需进行简单配置即可快速对接QQ互联平台。同时,为了在前后端分离架

cqwmy840702的博客 450

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

新一代液晶按键网银USBkey安全分析

网上银行由于其方便性,已经成为人们日常生活中经常使用的平台,银行用户可以不出家门,就可以通过互联网完成支付、转帐、交费等众多业务,省去了银行排队,携带大量现金等即费时繁琐,又不安全的原始业务形式。 随着网银业务的广泛普及,网银的安全性也是大家非常关注的一个问题。简单的用户名/密码方式已经被屏弃淘汰,取而代之的是十分安全的PKI数字证书认证体系,该体系主要通过数字证书中的RSA非对称密钥完成数据传

meimeihuazi的专栏 1115

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

小程序微信客服接入智能体的技术实现与避坑指南

我们最后选了方案 3,理由:小程序日活 8w,峰谷明显,自建 GPU 服务器成本平摊下来比按条计费便宜 40%,且知识库涉及商品配方,必须私有。”刷屏,三班倒都扛不住。传统微信客服的痛点一句话就能概括——“人多活杂响应慢”。老板要的是 7×24 秒回、还能越聊越聪明的“客服”,于是 AI 智能体成了刚需。微信客服本质是企业微信微信服务器 → 开发者服务器的单向 Webhook,官方叫「消息推送」。为了易读,异常处理、日志、重试都精简,别直接上生产。,用令牌令牌计算 SHA1 签名校验,防止伪造。

2600_94959989的博客 620
上一篇: /bin和/sbin
下一篇: KVM安装及使用
HelloCooper
博客等级 码龄11年 13粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值