HMAC认证

hmac 插件

构造签名header

Authorization: hmac username="userhmac", algorithm="hmac-sha1", headers="X-Date Content-md5", signature="LqkezHTAuk/Sk3RTbguHHYZGt/8="

X-Date: Mon, 31 Jul 2017 07:23:02 GMT

Content-md5: IgWlVHazOsGgHGVlcKvQDA==

执行结果:成功

详解:Base64(HMAC-SHA1(signing string))加密详解:

一、事先准备加密工具HmacSha1Util 和 Md5Util。

1).编写HMacSha1Util.java,参看附1内容。

2).编写Md5Util,参考附2内容。

3).准备mac用户和密钥: username=userhmac,secret=zcy@0808

二、计算hmac签名

1).计算body Content-md5.

2).构建待签名报文String content = stb.append("X-Date: ").append(hdate).append("\n").append("Content-md5: ").append(contentMD5).toString(); //注意 X-Date: 后有一个空格,紧接着才是US制 GMT时间。

3).构建签名String signature = BASE64.encode(HmacSha1Util.signatureReturnBytes(content, secret));

详细请参看附3 HmacTest.java

根据HmacTest.test1()方法执行的结果输出:

15:25:07.774 [main] INFO  com.kong.test.hmac.HmacTest - Content-md5: IgWlVHazOsGgHGVlcKvQDA==

15:25:07.793 [main] INFO  com.kong.test.hmac.HmacTest - X-Date: Mon, 31 Jul 2017 07:25:07 GMT

15:25:07.794 [main] INFO  com.kong.test.hmac.HmacTest -签名前内容: X-Date: Mon, 31 Jul 2017 07:25:07 GMT

Content-md5: IgWlVHazOsGgHGVlcKvQDA==

15:25:08.557 [main] INFO  com.kong.test.hmac.HmacTest -显示指定编码[推荐]: p4sGy3B+J/Zqt7gaLJVZCzVY5/Y=

将以上内容输出结果,按下文格式构建request报文。

三、构建request报文:

设置headers:

Authorization:hmac username="userhmac", algorithm="hmac-sha1", headers="X-Date Content-md5", signature="p4sGy3B+J/Zqt7gaLJVZCzVY5/Y="

X-Date:Mon, 31 Jul 2017 07:25:07 GMT

Content-md5:IgWlVHazOsGgHGVlcKvQDA==

四、验证结果

如下图,正常返回,hamc加密认证成功。

附1 HmacSha1Util.java:

package com.kong.test.hmac;import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;/*** @Author changle* @Time 17/7/23.* @Desc 计算hmac签名*/
public class HmacSha1Util {private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";private static String toHexString(byte[] bytes) {Formatter formatter = new Formatter();for (byte b : bytes) {formatter.format("%02x", b);}return formatter.toString();}public static String signature(String data, String key) throws NoSuchAlgorithmException, InvalidKeyException {SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);mac.init(signingKey);return toHexString(mac.doFinal(data.getBytes()));}public static byte[] signatureReturnBytes(String data, String key) throws NoSuchAlgorithmException, InvalidKeyException {SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);mac.init(signingKey);return mac.doFinal(data.getBytes());}public static void main(String[] args) throws Exception {String hmac = signature("data", "f96384947e0f4de39d3ffef6bd12c551");assert hmac.equals("104152c5bfdca07bc633eebd46199f0255c9f49d");}
}

附2 Md5Util.java:

package com.kong.test.hmac;import org.apache.commons.codec.binary.Base64;
import org.apache.commons.lang.StringUtils;import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;public class Md5Util {public static String md5(String param) {if (StringUtils.isBlank(param)) {throw new IllegalArgumentException("param can not be null");}try {byte[] bytes = param.getBytes("utf-8");final MessageDigest md = MessageDigest.getInstance("MD5");md.reset();md.update(bytes);final Base64 base64 = new Base64();final byte[] enbytes = base64.encode(md.digest());return new String(enbytes);} catch (final NoSuchAlgorithmException e) {throw new IllegalArgumentException("unknown algorithm MD5");} catch (UnsupportedEncodingException e) {throw new RuntimeException(e);}}
}

附3 HmacTest.java 计算mac签名:

package com.kong.test.hmac;import lombok.extern.slf4j.Slf4j;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Base64;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;/*** @Author changle* @Time 17/7/19.* @Desc HMac加密签名验证.*/
@Slf4j
public class HmacTest {public static void main(String[] args) {test1();}static void test1(){String queryParam = "/testHmac/qryParam=test1&pageNo=1";String contentMD5 = Md5Util.md5(queryParam);log.info("Content-md5: {}", contentMD5);Date d=new Date();DateFormat format=new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss z", Locale.US);format.setTimeZone(TimeZone.getTimeZone("GMT"));String hdate = format.format(d);log.info("X-Date: {}",hdate);StringBuilder stb = new StringBuilder();String content = stb.append("X-Date: ").append(hdate).append("\n").append("Content-md5: ").append(contentMD5).toString();log.info("签名前内容: "+content);String secret = "zcy@0808";  //用户userhmac的密钥try {String signature2 = new String(Base64.getEncoder().encode(HmacSha1Util.signatureReturnBytes(content, secret)), "US-ASCII");log.info("显示指定编码[推荐]: {}", signature2);} catch (Exception e) {e.printStackTrace();}}}

【kong系列八】之HMAC认证hmac-auth插件相关推荐

  1. 【kong系列九】之限流rate-limiting插件

    限流插件 rate-limiting 1.创建限流插件 为testBasicAuth 这个api创建限流规则. 插件配置: 配置Redis host.示例:127.0.0.1:6379 可配置项: y ...

  2. Flask扩展系列(八)–用户会话管理

    安装和启用 遵循标准的Flask扩展安装和启用方式,先通过pip来安装扩展: $ pip install Flask-Login 接下来创建扩展对象实例: 1 2 3 4 5 from flask i ...

  3. SpringSecurity系列之基于数据库认证

    SpringSecurity系列之基于数据库认证 本文中所使用的技术栈如下: SpringBoot 2.6.2 MyBatis Plus 3.5.0 SpringSecurity 5.6.1 一.创建 ...

  4. 【Youtobe trydjango】Django2.2教程和React实战系列八【渲染数据库数据与模板加载顺序探究】

    [Youtobe trydjango]Django2.2教程和React实战系列八[渲染数据库数据与模板加载顺序探究] 1. 准备数据 2. 渲染数据库数据到模板 3. 如何在app里加载django ...

  5. 【×××系列八】Dynamic Multipoint *** for IPv6 详解

    [×××系列八]Dynamic Multipoint *** for IPv6 详解 一.前言 由于涉及IPV6加密,所以根据思科标准此次配置使用思科7200系列高级企业版IOS (详情参考我的上一篇 ...

  6. 【深入浅出MyBatis系列八】SQL自动生成插件

    为什么80%的码农都做不了架构师?>>>    #0 系列目录# 深入浅出MyBatis系列 [深入浅出MyBatis系列一]MyBatis入门 [深入浅出MyBatis系列二]配置 ...

  7. 数学之美 系列八-- 贾里尼克的故事和现代语言处理

    数学之美 系列八-- 贾里尼克的故事和现代语言处理 读者也许注意到了,我们在前面的系列中多次提到了贾里尼克这个名字.事实上,现代语音识别和自然语言处理确实是和它的名字是紧密联系在一起的.我想在这回的系 ...

  8. information_schema系列八(事物,锁)

    information_schema系列八(事物,锁) 今天我们主要看一下MySQL information_schema里面的关于innodb的锁和事物的两三个系统表: 看一下锁对应的sql: se ...

  9. JAVA面试常考系列八

    转载自 JAVA面试常考系列八 题目一 JDBC是什么? JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系 ...

最新文章

  1. 使用JDBC进行MySQL 5.1的数据连接、查询、修改等操作练习。
  2. 前端开发-日常开发沉淀之生产环境与开发环境
  3. [转]vc中socket编程步骤
  4. 前端后台管理系统梳理
  5. C++ String类写时拷贝 4
  6. SpringCloud创建Config读取本地配置
  7. 用python把excel中的数据变成字典(复制代码即可用)
  8. AWT_Swing_图标按钮(Java)
  9. SecureRandom生成随机数慢(阻塞)问题解决记录
  10. Kotlin从入门到放弃(三)——协程
  11. 大一c语言上机题库及详解答案,二级C语言上机题答案(题库答案).doc
  12. Java 常用命令总结
  13. 【学习笔记】状态机编程
  14. 静态网页连接mysql数据库_静态网页可以联接sql数据库吗?代码怎么写?
  15. office2010专业版
  16. LINUX系统开机后出现assuming drive cache:write through* 无法开机
  17. 中康科技黄毅宁:AI+医疗,于我而言是圆梦
  18. aspen压缩因子_Aspen 物性代号及常用的英语单词中英文对照
  19. MySQL培训-梅科尔
  20. 苏州地区--校招IT公司

热门文章

  1. 学习英文-学以致用【场景:找朋友】
  2. Android小米,华为平台对接厂商推送,相关SDK集成步骤
  3. 【Linux学习】之chown命令
  4. 顶象入选“工控安全推进分会” 助力贯标试点示范
  5. 桃花笑计算机弹奏,桃花笑春天
  6. 遠端桌面連線失敗,出現:遠端工作階段中斷 因為沒有遠端桌面用戶端存取使用權...
  7. 能量星球!无线电力传输技术走进现…
  8. bars 除障句完整_Bars,最简单实用的疗愈工具!一天学会,全家受益!
  9. 做最好的日期控件,My97 DatePicker 4.8 Beta4
  10. 王者服务器维护8月四日,王者荣耀8月4日体验服更新维护公告 弈星重做上线体验服...