使用Qt实现阿里云API签名

2023-05-16

最近需要使用阿里云API来访问物联网平台,但是阿里官方的C++版API有些复杂而且编译有些问题,所以决定自己来实现,这里主要就是要解决签名的问题,下面把签名实现的部分分享一下。

使用示例

下面是请求阿里云物联网平台所有产品信息的示例。

AlicloudAPIHelper helper("http://iot.cn-shanghai.aliyuncs.com","your key","your secret");
helper.setParam("Action","QueryProduct");
helper.setParam("ProductKey","your productkey");
helper.setParam("IotInstanceId","your instanceid");
QNetworkAccessManager *manager = new QNetworkAccessManager(this);
connect(manager, &QNetworkAccessManager::finished,this, &Widget::replyFinished);
manager->get(QNetworkRequest(QUrl(helper.signatureUrl())));

源代码

alicloudapihelper.cpp

#include "alicloudapihelper.h"

#include <QDateTime>
#include <QRandomGenerator64>
#include <QCryptographicHash>

AlicloudAPIHelper::AlicloudAPIHelper(QString httpaddr,QString key, QString secret,QString method,QString format)
{
    m_httpaddr = httpaddr;
    m_accessKey = key;
    m_accessSecret = secret;
    m_method = method;
    m_format = format;
}


QString AlicloudAPIHelper::paramsToUrl(bool encode)
{
    QString url;
    QMap<QString,QString>::iterator iter;
    for (iter = m_params.begin(); iter != m_params.end(); iter++)
    {
        if (!url.isEmpty()) url += "&";
        if(encode)
        {
            url += QString(iter.key().toUtf8().toPercentEncoding()) + "=" + QString(iter.value().toUtf8().toPercentEncoding());
        }
        else
        {
            url += QString("%1=%2").arg(iter.key(),iter.value());
        }
    }
    return url;
}

void AlicloudAPIHelper::setMethod(QString method)
{
    m_method = method;
}

void AlicloudAPIHelper::setFormat(QString format)
{
    m_format = format;
}

void AlicloudAPIHelper::setAcceccParam(QString key, QString secret)
{
    m_accessKey = key;
    m_accessSecret = secret;
}

void AlicloudAPIHelper::addParam(QString pname, QString pvalue)
{
    if (m_params.find(pname) == m_params.end())
        m_params.insert(pname,pvalue);
}

void AlicloudAPIHelper::setParam(QString pname, QString pvalue)
{
    m_params[pname] = pvalue;
}

QString AlicloudAPIHelper::getParam(QString pname)
{
    return m_params[pname];
}

QString AlicloudAPIHelper::signatureUrl()
{
    //公共参数
    QDateTime local(QDateTime::currentDateTime());
    QDateTime UTC(local.toTimeSpec(Qt::UTC));
    m_params.insert("Format",m_format);
    m_params.insert("Version","2018-01-20");
    m_params.insert("AccessKeyId",m_accessKey);
    m_params.insert("SignatureMethod","HMAC-SHA1");
    m_params.insert("Timestamp",UTC.toString(Qt::ISODate));
    m_params.insert("SignatureVersion","1.0");
    m_params.insert("SignatureNonce",QString("%1").arg(QRandomGenerator64::global()->generate()));
    m_params.insert("RegionId","cn-shanghai");

    QString str = m_method + "&" + QString("/").toUtf8().toPercentEncoding() + "&" + paramsToUrl(true).toUtf8().toPercentEncoding();
    QByteArray signature = hmacSha1(str.toUtf8(), QString(m_accessSecret+"&").toUtf8());
    m_params.insert("Signature",QString(signature.toPercentEncoding()));
    return m_httpaddr+"/?"+paramsToUrl();
}

QByteArray AlicloudAPIHelper::hmacSha1(QByteArray baseString,QByteArray key)
{
    int blockSize = 64; // HMAC-SHA-1 block size, defined in SHA-1 standard
    if (key.length() > blockSize) { // if key is longer than block size (64), reduce key length with SHA-1 compression
    key = QCryptographicHash::hash(key, QCryptographicHash::Sha1);
    }
    QByteArray innerPadding(blockSize, char(0x36)); // initialize inner padding with char "6"

    QByteArray outerPadding(blockSize, char(0x5c)); // initialize outer padding with char "quot;
    // ascii characters 0x36 ("6") and 0x5c ("quot;) are selected because they have large
    // Hamming distance (http://en.wikipedia.org/wiki/Hamming_distance)
    for (int i = 0; i < key.length(); i++) {

    innerPadding[i] = innerPadding[i] ^ key.at(i); // XOR operation between every byte in key and innerpadding, of key length
    outerPadding[i] = outerPadding[i] ^ key.at(i); // XOR operation between every byte in key and outerpadding, of key length
    }
    // result = hash ( outerPadding CONCAT hash ( innerPadding CONCAT baseString ) ).toBase64

    QByteArray total = outerPadding;
    QByteArray part = innerPadding;
    part.append(baseString);
    total.append(QCryptographicHash::hash(part, QCryptographicHash::Sha1));
    QByteArray hashed = QCryptographicHash::hash(total, QCryptographicHash::Sha1);
    return hashed.toBase64();
}

alicloudaiphelper.h

#ifndef ALICLOUDAPIHELPER_H
#define ALICLOUDAPIHELPER_H

#include <QMap>
#include <QString>

class AlicloudAPIHelper
{
public:
    AlicloudAPIHelper(QString httpaddr,QString key, QString secret,QString method="GET",QString format="JSON");
    static QByteArray hmacSha1(QByteArray baseString,QByteArray key);
    void setMethod(QString method);
    void setFormat(QString format);
    void setAcceccParam(QString key,QString secret);
    void addParam(QString pname, QString pvalue);
    void setParam(QString pname, QString pvalue);
    QString getParam(QString pname);
    QString signatureUrl();
private:
    QString paramsToUrl(bool encode=false);
    QString m_method;
    QString m_httpaddr;
    QString m_format;
    QString m_accessKey;
    QString m_accessSecret;
    QMap<QString,QString> m_params;
};

#endif // ALICLOUDAPIHELPER_H

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Qt实现阿里云API签名 的相关文章

随机推荐

  • ubuntu22.04安装vmware tools

    前言 安装VMware Tools经常会出现兼容性不好 xff0c 系统之间复制文件失灵 xff0c 并且安装时提示建议使用open vm tools xff0c 于是放弃vmware tools的安装 xff0c 尝试使用open vm
  • ubuntu22.04安装ibus中文输入法

    前言 IBus xff08 英文全称为Intelligent Input Bus xff09 xff0c 是GNU Linux和类UNIX操作系统下的以GPL协议分发源代码的开源免费多语言输入法框架 首先 在安装中文输入法之前 xff0c
  • 信息安全之数字信封原理

    概述 一般来说对称加密算法的密钥短 xff0c 加密算法简单 xff0c 适用于大量数据加密的场合 xff0c 在现在的技术条件下比较容易破解 xff1b 相比较而言非对称加密的密钥长 xff0c 加解密算法复杂 xff0c 很难破解 xf
  • 信息安全之信息摘要技术

    什么是信息摘要 xff1f 指一段数据的特征信息 xff0c 当数据发生了改变 xff0c 信息摘要也会发生改变 信息摘要是由哈希函数生成的 主要为了保证数据的完整性 xff0c 保证接收到的数据不被篡改 常见的摘要计算方法有MD5 128
  • 信息安全技术之数字签名

    什么是数字签名 xff1f 就类似于生活中公司发布一些文件 放假通知啥的 xff0c 老板会在文件的后面签名或者会盖上公司的印章 xff0c 目的就是标识这个文件是公司发布的 在计算机中我们没办法像真实世界那样签名 xff0c 这时候我们就
  • 设置Mysql C API断线自动重连

    Mysql的C API自带重连功能 xff0c 执行语句时发现连接断开 xff0c mysql库会尝试重连 xff0c 并重新执行语句 使用mysql options函数设置MYSQL OPT RECONNECT选项可以开启自动重连功能 默
  • mysql_query()和myql_real_query()的区别

    函数原型 span class token keyword int span span class token function mysql query span span class token punctuation span MYSQ
  • mysql_store_result和mysql_use_result的区别

    mysql store result 本次查询的所有结果都缓存到客户端 xff0c 这样做的好处是可以随意的访问结果中的值 xff0c 例如可以使用mysql data seek 和mysql row seek 访问任意位置的数据或者行 同
  • linux下实时跟踪文件变化tail指令

    很多时候我们程序进入后台之后 xff0c 日志信息会写入到文件中 此时如果用一般的文件操作指令 例如cat xff0c 手动的一次一次的查看 tail命令在这个时候就非常有用 span class token comment 使用 f参数指
  • 【教程】老主板可以用上Nvme协议的固态硬盘?当然可以!!!!(注意:只适用于支持UEFI BIOS的主板)

    如今固态硬盘分为SATA协议和Nvme协议的 xff0c 虽然SATA协议的固态硬盘已经可以满足大多数用户的需求 xff0c 但是和Nvme协议的固态硬盘比起来差别还是很大的 xff0c SATA协议的固态硬盘最多500 600MB s的传
  • 解决windeployqt打包QML程序无法启动的问题

    windeployqt exe是qt自带的打包工具 xff0c 在打包qml程序时需要带上 qmldir参数 xff0c 指定qml导入符号的路径 xff0c 否则会出现无法启动的问题 windeployqt xxx exe qmldir
  • windows下如何找到占用文件或文件夹的程序

    我们在操作一个文件或文件夹时 xff0c 经常会遇到被占用的问题 xff0c 如下图 绝大部分情况下我们知道是那些程序占用 xff0c 可以直接关闭他 xff0c 但是也有很多时候我们不知道是哪个程序占用的 xff0c 可以用下面的方式来解
  • 正则表达式的零宽断言

    概念 断言 xff1a 就是说正则可以指明在指定的内容的前面或后面会出现满足指定规则的内容 零宽 xff1a 代表断言是一个占位符 xff0c 并不会在查找结果中输出 实例 使用的测试原文如下 xff1a lt w t gt 测试1 lt
  • 如何在Qt中使用zlib

    前言 环境 xff1a qt5 9 9 zlib1 2 1 windows10 QtCreator4 11 0 本文介绍了在Qt中使用zlib的方式 使用的场景是在上位机软件中使用解压缩功能 点击此处下载本文完整的示例代码 问题 比较麻烦的
  • 如何在程序中解析获取word文档(docx格式)的文本内容

    原理 docx格式的word文档其实是一个压缩包 xff0c 文本内容 格式 图片等是分别存储在不同的文件中的 xff0c office通过这些文件还原出我们所看到的word文档 下面以一个简单的示例来说明docx格式 示例 首先我们新建一
  • QFormLayout布局该什么时候使用

    概述 QFormLayout是一种支持两列的格子布局方式 xff0c 左列是标签 xff0c 右列是窗口部件 可以方便且快速的实现标签和输入组件的组合 xff0c 如下图 示例 像上面的例子 xff0c 使用QGridLayout 栅格布局
  • Qt判断文件类型 QMimeType

    前言 通常来说我们判断一个文件的类型是根据后缀名称来的 xff0c 例如 xff1a txt是文本文件 exe是二进制文件可执行程序 在程序中需要预设后缀名称 xff0c 有些时候不太容易把属于某类文件的后缀名写全 比如说图片类型的文件 x
  • 在qmake中定义子项目的编译顺序(依赖关系)

    背景 当一个大项目中包含多个子项目时 xff0c 往往子项目之间有依赖关系 xff0c 这时需要在pro文件中指明子项目的编译顺序 xff0c 否则编译整个项目的时候可能会失败 实现 现有项目一名称为Porject1 xff0c 包含三个子
  • lua面向对象-----继承的实现

    前言 在lua里是没有类的概念的 xff0c 但是可以利用表 xff08 table xff09 和元表特性来实现面向对象和继承 lua的表类似于一个对象 xff0c 每个对象都有自己的方法和属性 当访问一个表中不存在的属性时 xff0c
  • 使用Qt实现阿里云API签名

    最近需要使用阿里云API来访问物联网平台 xff0c 但是阿里官方的C 43 43 版API有些复杂而且编译有些问题 xff0c 所以决定自己来实现 xff0c 这里主要就是要解决签名的问题 xff0c 下面把签名实现的部分分享一下 使用示