apisix的hmac-auth认证

目录

1、apisix的hmac认证Authorization头信息

2、signature的lua生成源码

3、java生成签证的简单示例

4、postman调用如下


apisix的hmac-auth认证,介绍可以看官方文档

hmac-auth | Apache APISIX® -- Cloud-Native API Gateway

照着官方文档,发现生成的签证根本调不通,所以研究了一下hmac-auth的生成源码,下面记录一下apisix的hmac需要怎么传参

1、apisix的hmac认证Authorization头信息

1.1hmac认证Authorization内容:


Signature signature="{具体签名}", keyId="{hmac的key}", algorithm="{hmac的算法}", headers="{需要生成签证的请求头}"


生成结果如下:
Signature signature="PpSL9rq26QtITXh33NhUpBJkNiskkkEDKKzFYqKKIC4=", keyId="a0f4cafbe86a43d5bcfdb7e97f32215b", algorithm="hmac-sha256", headers="date"

1.2参数介绍

algorithm:hmac支持的算法。具体可以看源码或者文档,只有几种,下面都是用的默认的算法HmacSHA256

headers:是说生成签名需要用的头信息,header里面的顺序也影响签名,具体签名生成见下文。下面介绍几个可能常用的header头。下面只是常用参数,还有一些别的head参数。验证了一下,不支持request-body这种不规范的

headers="date  @request-target"

date: GMT格式日期。  一般是搭配签证过期窗口使用的

@request-target:是一个特殊的字段,通常用于 HTTP 请求的签名生成。它表示请求的目标 URI(即请求的路径和查询参数),而不是请求头中的其他字段,可以理解成具有含义的常量,经常会用它判断逻辑

2、signature的lua生成源码

hmac-auth.lua文件,在验证的时候加了一下core.log.warn打印日志,获取一些中间结果

local function generate_signature(ctx, secret_key, params)
    local uri = ctx.var.request_uri
    local request_method = core.request.get_method()

    if uri == "" then
        uri = "/"
    end

    local signing_string_items = {
        params.keyId,
    }

    if params.headers then
        for _, h in ipairs(params.headers) do
            local canonical_header = core.request.header(ctx, h)
            if not canonical_header then
              if h == "@request-target" then
                local request_target = request_method .. " " .. uri
                core.table.insert(signing_string_items, request_target)
                core.log.warn("canonical_header name:", core.json.delay_encode(h))
                core.log.warn("canonical_header value: ",
                              core.json.delay_encode(request_target))
              end
            else
              core.table.insert(signing_string_items,
                                h .. ": " .. canonical_header)
              core.log.warn("canonical_header name1:", core.json.delay_encode(h))
              core.log.warn("canonical_header value1: ",
                            core.json.delay_encode(canonical_header))
            end
        end
    end

    local signing_string = core.table.concat(signing_string_items, "\n") .. "\n"
core.log.warn("======signing_string签证:", signing_string)
    return hmac_funcs[params.algorithm](secret_key, signing_string)
end

可以看出,如果请求头有@request-target,生成签证会用到uri和request_method,否则是不会用到的
(1)如果头没有@request-target,例如headers="request-line date request-body"
如果是get请求,那生成签证,就只需要keyId+"\n"+"date: "+具体GMT时间+"\n"
(2) 如果头有@request-target,例如headers="request-line date request-body @request-target"
如果是get请求,那生成签证,就要keyId+"\n"+"date: "+具体GMT时间+"\n"+request_method+" "+uri

3、java生成签证的简单示例

@Slf4j
public class HmacUtils {/**** 获取签证信息* @return String  返回值,message的生成规则和顺序都不是固定的,是根据header变化的* @Author: shisha* @Date: 2024/12/25 10:22**/public static String getSignature(String key,String hmacSecret) throws Exception {String dateStr = getCurrentGmt();//key和时间 "a0f4cafbe86a43d5bcfdb7e97f32215b\ndate: Tue, 24 Dec 2024 12:27:55 GMT\n";//   headers="date"String message = key +"\n"+"date: "+dateStr+"\n";//如果headers="date @request-target"//TODO message的生成规则和顺序都不是固定的,是根据header变化的message+="GET /dapi/v1.0/ssApi/getDataForGet?query=%7B%22pageIndex%22%3A1%2C%22pageSize%22%3A10%2C" +"%22apiTestToken%22%3A%2202024121716460709700000101001349%22%2C%22dz%22%3A%22%2Fdcpyo" +"%2FPRODUCTScxfw_4090%22%2C%22list%22%3A%5B%7B%22bm%22%3A%22PRODUCT_NAME%22%2C%22jtz%22%3A" +"%22RTX5060%22%7D%5D%2C%22apiId%22%3A%2202024112711241051600000101660374%22%7D&t=1734425245421\n" ;//获取签证return generateHmacSha256Base64(hmacSecret, message);}/**** Hmac生成签证的base64工具* @param message* @return String  返回值* @Author: shisha* @Date: 2024/12/25 9:49**/public static String generateHmacSha256Base64(String hmacSecret, String message) throws Exception {// 创建 HMAC-SHA256 实例Mac sha256_HMAC = Mac.getInstance("HmacSHA256");SecretKeySpec secret_key = new SecretKeySpec(hmacSecret.getBytes("UTF-8"), "HmacSHA256");sha256_HMAC.init(secret_key);// 计算 HMAC 值byte[] hmacBytes = sha256_HMAC.doFinal(message.getBytes("UTF-8"));// 进行 Base64 编码return Base64.getEncoder().encodeToString(hmacBytes);}public static String getCurrentGmt() {Date date = new Date();// Wed, 25 Dec 2024 01:50:59 GMTString form = "E, dd MMM yyyy HH:mm:ss";Locale locale = Locale.ENGLISH;SimpleDateFormat sdf = new SimpleDateFormat(form, locale);sdf.setTimeZone(TimeZone.getTimeZone("GMT"));String gmtTime = sdf.format(date) + " GMT";// 输出GMT时间字符串log.info(gmtTime);return gmtTime;}public static void main(String[] args) throws Exception {String key = "2e06116d05d6399c90c8a441942fb113";String hmacSecret = "005B192C781AEB9F641BC71DC6C63A43245E7ABBD";String signature = getSignature(key,hmacSecret);log.info(signature);//调用postman的请求参数示例,Authorization格式如下:// Signature signature="PpSL9rq26QtITXh33NhUpBJkNiskkkEDKKzFYqKKIC4=", keyId="a0f4cafbe86a43d5bcfdb7e97f32215b", algorithm="hmac-sha256", headers="request-line date request-body"}

4、postman调用如下

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大数据导论汇总

第一章 作业 2、请阐述把数据变得可用需要经过哪几个步骤. 答:一共要经历三个步骤:数据清洗、数据管理、数据分析。 第一步:数据清洗。使用数据的第一步通常是数据清洗,也就是把数据变成一种可用的状态。这个过程需要借助工具去…

React 组件的通信方式

在 React 应用开发中,组件之间的通信是构建复杂用户界面和交互逻辑的关键。正确地实现组件通信能够让我们的应用更加灵活和易于维护。以下是几种常见的 React组件通信方式。 一、父子组件通信 1. 通过 props 传递数据(父组件向子组件传递数据&#xff0…

【JDBC】转账案例

回顾 使用工具类查询表 需求: 查询student表的所有数据,把数据封装到一个集合中 数据准备 #创建表 CREATE TABLE student( sid INT, name VARCHAR(100), age INT, sex VARCHAR(100) ) #插入数据 INSERT INTO student VALUES(1,张三,18,女),(2…

dede-cms关于shell漏洞

一.文件式管理器 1.新建文件 新建一个php文件,内容写个php脚本语言 访问,可以运行 2.文件上传 上传一个php文件,内容同样写一个php代码 访问,运行成功 二.模块-广告管理 来到模块-广告管理——>增加一个新广告 在这里试一下…

k-Means聚类算法 HNUST【数据分析技术】(2025)

1.理论知识 K-means算法,又称为k均值算法。K-means算法中的k表示的是聚类为k个簇,means代表取每一个聚类中数据值的均值作为该簇的中心,或者称为质心,即用每一个的类的质心对该簇进行描述。K-Means算法接受参数K;然后将…

Opencv之对图片的处理和运算

Opencv实现对图片的处理和修改 目录 Opencv实现对图片的处理和修改灰度图读取灰度图转换灰度图 RBG图单通道图方法一方法二 单通道图显色合并单通道图 图片截取图片打码图片组合缩放格式1格式2 图像运算图像ma[m:n,x:y]b[m1:n1,x1:y1] add加权运算 灰度图 读取灰度图 imread(‘…

【算法思想04】二分查找

文章目录 1. 基本思想与实现1.1 基本思想1.2 值m的计算方式1.3 查找失败时的返回值1.4 代码实现1.4.1 循环1.4.2 递归 2. 性能分析2.1 时间复杂度2.2 与顺序查找的效率比较 3. 应用3.1 前提3.2 变体3.2.1 最基本的二分查找3.2.2 寻找左侧边界的二分查找3.2.3 寻找右侧边界的二分…

【brainpan靶场渗透】

文章目录 一、基础信息 二、信息收集 三、反弹shell 四、提权 一、基础信息 Kali IP:192.168.20.146 靶机 IP:192.168.20.155 二、信息收集 似乎开放了9999,10000端口,访问页面没有太多内容,扫描一下目录 dirs…

matlab reshape permute

1.reshape 将向量按照顺序重新构建 矩阵,新矩阵 先排完第一列, 再第二列… 2.permute 将向量 维度变换

comctl32.dll没有被指定在window运行怎么解决?

一、文件丢失问题:comctl32.dll没有被指定在Windows上运行怎么解决? comctl32.dll是Windows操作系统中的一个重要组件,它负责提供用户界面元素,如按钮、对话框和列表视图等。当系统提示“comctl32.dll没有被指定在Windows上运行”…

Qt下使用AES进行字符串加密解密

文章目录 前言一、获取QAESEncryption库二、加密与解密实现三、示例完整代码四、下载链接总结 前言 引用:AES(Advanced Encryption Standard)是一种对称加密算法,被广泛用于数据加密,提供128、192、256位三种密钥长度&…

docker 安装minio

docker pull minio/minio #启动 mkdir -p /root/minio/config mkdir -p /root/minio/datadocker run -d \--name minio \-p 9002:9000 \-p 9001:9001 \--restartalways \-v /root/minio/data:/data \-v /root/minio/config:/root/.minio \-e "MINIO_ACCESS_KEYminioadmin…

Linux系统下安装配置 Nginx 超详细图文教程

一、下载Nginx安装包 nginx官网:nginx: download[这里是图片001]http://nginx.org/en/download.html 找到我们所需要版本,把鼠标移动到上面,右键打开链接进行下载 或者如果Linux联网,直接在Linux服务上使用wget命令把Nginx安装包…

爬虫与反爬虫实现全流程

我选取的网页爬取的是ppt nba版 需要的工具:pycharm,浏览器 爬虫需要观察它的网页信息,然后开始首先爬取它的html,可以看到有人气,标题,日期,咨询 可以看到用get方法 import requests url"https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhttps%3A%2…

最新版Edge浏览器加载ActiveX控件技术——alWebPlugin中间件V2.0.28-迎春版发布

allWebPlugin简介 allWebPlugin中间件是一款为用户提供安全、可靠、便捷的浏览器插件服务的中间件产品,致力于将浏览器插件重新应用到所有浏览器。它将现有ActiveX控件直接嵌入浏览器,实现插件加载、界面显示、接口调用、事件回调等。支持Chrome、Firefo…

OSPFv2协议状态切换(状态机)基本原理-RFC2328

个人认为,理解报文就理解了协议。通过报文中的字段可以理解协议在交互过程中相关传递的信息,更加便于理解协议。 自动换行 OSPFv2: 关于 OSPFv2 协议基本原理,可参考RFC2328-OSPF Version 2。 其他相关资料可参考: …

【最新】沃德协会管理系统源码+uniapp前端+环境教程

一.系统介绍 一款基于FastAdminThinkPHPUniapp开发的商协会系统,新一代数字化商协会运营管理系统,以“智慧化会员体系、智敏化内容运营、智能化活动构建”三大板块为基点,实施功能全场景覆盖,一站式解决商协会需求壁垒&#xff0…

【LeetCode: 83. 删除排序链表中的重复元素 + 链表】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

算法练习——模拟题

前言:模拟题的特点在于没有什么固定的技巧,完全考验自己的代码能力,因此有助于提升自己的代码水平。如果说一定有什么技巧的话,那就是有的模拟题能够通过找规律来简化算法。 一:替换所有问号 题目要求: 解…

Idea创建JDK17的maven项目失败

Idea创建JDK17的maven项目失败 Error occurred during initialization of VM Could not find agent library instrument on the library path, with error: Can’t find dependent libraries Possible solution: Check your maven runner VM options. Open Maven Runner setti…