Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法

这篇具有很好参考价值的文章主要介绍了Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

OneNET - 中国移动物联网开放平台 (10086.cn)

"文档中心 /OneNET Studio /应用开发 /应用API /安全鉴权"

安全鉴权

最近更新时间:2022-02-11 16:44:25

Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法,Qt相关,物联网 OneNet,安全,qt,c++,物联网

准备资料:

  1. accessKey
  2. 用户ID

用户ID 和 accessKey 获取:

Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法,Qt相关,物联网 OneNet,安全,qt,c++,物联网

先看最终需要生成的结果是什么:

version=2020-05-29&res=userid%2F38055&et=1623982416&method=sha1&sign=S04GcvafYIjtAMHJthkGPevbNwE%3D

组成部分:中间用"&"链接起来

  1. version
  2. res
  3. userid:实际上就是userid/用户id,若用户id为:333333,则userid:"userid/333333"
  4. et
  5. method
  6. sig

Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法,Qt相关,物联网 OneNet,安全,qt,c++,物联网

sign的组成稍稍有点复杂,先展示一下官方提供的生成公式:

Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法,Qt相关,物联网 OneNet,安全,qt,c++,物联网

Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法,Qt相关,物联网 OneNet,安全,qt,c++,物联网

//et、method、res、version都是字符串变量
StringForSignature = et + '\n' + method + '\n' +res + '\n' + version

sign=base64(hmac_<method>(base64decode(accessKey),utf-8(StringForSignature)))

Qt代码实现:

void fun(){
//#-------------------------------------------------
/*
StringForSignature=et+” \n” +method+” \n” +res+” \n”+version
1623982416
SHA256
userid/1
20220501

`sign=base64(hmac_<method>(base64decode(accessKey),utf-8(StringForSignature)))`


1970年1⽉1⽇(00:00:00GMT)Unix时间戳 (UnixTimestamp)
1.什么是时间戳?时间戳是指格林威治时间⾃1970年1⽉1⽇(00:00:00 GMT)⾄当前时间的总秒数。
*/
    qint64 seconds = 0;
    seconds = QDateTime::currentDateTime().toSecsSinceEpoch();
    qDebug() << "Greenwich time in seconds: " << seconds + 3600;

    QString access_key = "填你们自己的access_key ";
    QString et = QString("%1").arg(seconds + 3600);
    QString method = "sha1";
    QString userid = "填你们自己的用户ID";
    QString res = "userid/" + userid;
    QString version = "2020-05-29";

    //步骤1 解码 access_key
    QByteArray key = QByteArray::fromBase64(access_key.toUtf8());
    qDebug() << "key.toHex():" << key.toHex();

    //步骤2 拼接 stringForSignature
    QString stringForSignature = et + '\n' + method + '\n' + res + '\n' + version;
    qDebug() << "stringForSignature:" << stringForSignature;
//    qDebug() << "stringForSignature.toUtf8().toHex():" << stringForSignature.toUtf8().toHex();

    //步骤三  按 Sha1 编码
    QByteArray sign_b = QMessageAuthenticationCode::hash(stringForSignature.toUtf8(),
                                                         key,
                                                         QCryptographicHash::Sha1);


    qDebug() << "sign_b.toHex():" << sign_b.toHex();
    QString sign = QString(sign_b.toBase64()).toUtf8();
    qDebug() << "---------- sign:" << sign;

    //步骤四 url编码
    sign = QUrl::toPercentEncoding(sign);
    res = QUrl::toPercentEncoding(res);
    qDebug() << "---------- sign url encode:" << sign;
    qDebug() << "---------- res url encode:" << res;

    //步骤五 合并
    QString token;
    token += "version=" + version;
    token += "&res=" + res;
    token += "&et=" + et;
    token += "&method=" + method;
    token += "&sign=" + sign;
    qDebug() << "---------- token:" << token;
    //#-------------------------------------------------
}

在第四步中,需要进行url编码

Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法,Qt相关,物联网 OneNet,安全,qt,c++,物联网文章来源地址https://www.toymoban.com/news/detail-802687.html

官方提供的Python代码,可以做测试,Qt代码调试以Py代码做验证

    import base64
    import hmac
    import time
    from urllib.parse import quote
    
    def token(user_id,access_key):
    
        version = '2020-05-29'
    
        res = 'userid/%s' % user_id
    
        # 用户自定义token过期时间
        et = str(int(time.time()) + 3600)
    
        # 签名方法,支持md5、sha1、sha256
        method = 'sha1'
    
        # 对access_key进行decode
        key = base64.b64decode(access_key)
    
        # 计算sign
        org = et + '\n' + method + '\n' + res + '\n' + version
        sign_b = hmac.new(key=key, msg=org.encode(), digestmod=method)
        sign = base64.b64encode(sign_b.digest()).decode()
    
        # value 部分进行url编码,method/res/version值较为简单无需编码
        sign = quote(sign, safe='')
        res = quote(res, safe='')
    
        # token参数拼接
        token = 'version=%s&res=%s&et=%s&method=%s&sign=%s' % (version, res, et, method, sign)
    
        return token
    
    
    if __name__ == '__main__':
        user_id = '37715'
        access_key = 'mjgvkTCYTBF6DguxMmm+aV9EkDp2CYfL5jzRTph5Th6KhU8gqZz/cBivPTA7tfY5'
    
        print(token(user_id,access_key))

分析调试心得

  • 运行官方提供的Py代码,然后使用apifox在线调试Get,测试鉴权的正确性提供一个测试工具
  • API调试 - OneNET物联网平台 (10086.cn) 在OneNet中的运维监控-API调试中选择一个接口,我选的是:物模型使用-设备属性记录查询
  • 在apifox上填写好参数就可以调试了,关键是Headers中的Authorization参数,还有其他Params参数,具体参考API调试上面的调试结果-真实请求URL
  • 确认API调试能够正常获取数据,确认将参数填写到apifox上也能够正常Get,准备就绪
  • 修改好Py的相关参数,计算得出Token数据,替换apifox中的Headers中的Authorization参数,如果apifox也能够正常Get,那么就可以开始Qt代码
  • Qt代码上列出的每一步都要确认是否都能和Py代码阶段成果一致,否则没办法在多重编解码中找出问题。
  • Py中对于bytes数据使用print(binascii.hexlify(bytes))输出十六进制,Qt中对于QByteArray使用toHex()输出十六进制,核对两者是否相一致。如果是ascii就直接输出即可。
  • Py和Qt中使用的时间戳都是动态获取的,在调试中,可以将Py和Qt的时间戳固定一个值,这样就可达到编码一致的效果,方便阶段成果对比。

到了这里,关于Qt6.5 OneNET Studio 应用API 的安全鉴权token生成算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 精通api接口测试,接口分类,接口架构,http,webservice,dubbo接口协议,接口流程,接口工具,cookie,session,token接口鉴权原理以及实战

    接口口测试和接口自动化测试一直都是很多人混乱的概念。所以搞清楚2个的概念是很重要的一件事情。 接口:一段具备逻辑处理功能的程序代码组成的,可被其他方法、服务或应用所使用。 对于调用接口的那一方,可以把接口看做一只黑匣子,只需要负责按约定传入参数,

    2024年02月02日
    浏览(43)
  • Win10/11平台OBS-Studio 源码联合QT6.3和VS2019编译教程

    本文默认编译64位程序。 下载源码可以通过Git下载,也可以直接下载zip文件。 通过Git下载 打开OBS-Studio的GitHub编译安装指导页[obs-studio wiki](Build Instructions For Windows · obsproject/obs-studio Wiki (github.com)),按照Option B: Custom Windows builds方法安装(当然,这种方法需要你提前装好[Git](

    2024年02月10日
    浏览(63)
  • Qt6和Rust结合构建桌面应用

    桌面应用程序是原生的、快速的、安全的,并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言,专注于安全性和性能,解决了 C/C++ 长期以来一直在努力解决的问题,例如内存错误和构建并发程序。 在桌面应用程序开发中使用的所有编程语言中,R

    2024年02月11日
    浏览(32)
  • Qt6之调用Windows下vc生成的动态链接库dll

    Qt是跨平台工具,显然能和windows的动态库一起使用。 在Windows操作系统上,库以文件的形式存在,并且可以分为动态链接库(DLL) 和静态链接库两种。动态链接库文控以.dll为后缀名,静态链接库文控以.lib为后缀名。不管是动态链接库还是静态链接库,都是向它们的调用者提供变

    2024年02月09日
    浏览(34)
  • 【QT教程】QT6 QML在虚拟现实中的应用

    主页  软件开发  QT6 QML框架原理与源码分析 补天云火鸟自动化创作平台 您能够创建大约3000 个短视频 一天可以轻松创建多达 100 个视频 【免费公开课 QT视频课程】您真的能免费看很多有用的QT视频! QT6_QML在虚拟现实中的应用 使用AI技术辅助生成 目录 1  QT6_QML基础回顾 1.

    2024年04月15日
    浏览(56)
  • 网关的鉴权与授权:实现安全的API访问控制

    API(Application Programming Interface,应用编程接口)是一种软件组件提供给其他软件组件使用的一种接口,它定义了如何访问某个功能或者数据集。API 提供了一种标准的方式来访问和操作数据,使得不同的系统和应用程序可以相互通信和协作。 随着微服务架构的普及,API 成为了企

    2024年04月14日
    浏览(37)
  • 业务流程编排系统设计中的API安全与鉴权

    在当今的数字时代,API(应用程序接口)已经成为企业和组织中不可或缺的组件。它们为不同系统之间的通信和数据共享提供了一个标准化的方式。然而,随着API的普及和使用,API安全和鉴权问题也变得越来越重要。业务流程编排系统中的API安全与鉴权涉及到保护API免受未经授

    2024年02月19日
    浏览(30)
  • 第六十六天 API安全-接口安全&阿里云KEY%postman&DVWS&XEE&鉴权&泄露

    1.HTTP类接口-测评 2.RPC类接口-测评 3.Web Service类-测评 参考链接:https://www.jianshu.com/p/e48db27d7c70 内容点: SOAP(Simple Object Access Protocol)简单对象访问协议是交换数据的一种协议规范, 是一种轻量的、简单的、基于XML(标准通用标记语言下的一个子集)的协议,它被设计 成在WEB上

    2024年02月22日
    浏览(34)
  • 使用Python和Qt6(PySide6)创建GUI应用1简介

    在本书从GUI开发的基本原理逐步过渡到使用PySide6创建您自己的、功能齐全的桌面应用程序。 图形用户界面(GUI Graphical User Interface) 历史悠久,可追溯到20世纪60年代。斯坦福大学的NLS(ON-Line 系统引入了鼠标和窗口概念,并于1968年首次公开展示。随后,施乐公司于1973年推出

    2024年02月04日
    浏览(38)
  • 【Sa-Token】SpringBoot 整合 Sa-Token 快速实现 API 接口签名安全校验

    在涉及跨系统接口调用时,我们容易碰到以下安全问题: 请求身份被伪造 请求参数被篡改 请求被抓包,然后重放攻击 sa-token api-sign 模块将帮你轻松解决以上难题。(此插件是内嵌到 sa-token-core 核心包中的模块,开发者无需再次引入其它依赖,插件直接可用) 假设我们有如

    2024年02月17日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包