全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 阿里云办公 培训与认证 物联网
消息队列 MQ

HTTP 签名

更新时间:2017-08-24 17:41:20

本文介绍 HTTP 协议的签名方式,适用于使用 HTTP 协议接入 MQ 的客户端。MQ HTTP 签名流程分为字符串拼接和计算签名两个步骤。

  1. 字符串拼接:将协议签名需要的参数列表按照组合方式生成签名前字符串。

  2. 计算签名:使用 HmacSHA1 签名算法,用 SecretKey 作为 HmacSHA1 的 Key,计算签名。

签名基本参数说明

  1. //所有 GET POST DELETE 签名前字符串的拼接使用 \n
  2. private static final String NEWLINE="\n";
  3. //签名所有的 byte 使用编码 UTF-8,所有的 string 编码 UTF-8
  4. private static final String ENCODE = "UTF-8";
  5. //签名算法 HmacSHA1
  6. public static final String HmacSHA1 = "HmacSHA1";

HTTP 签名计算

在拼接字符串阶段,HTTP 各个方法所需要的参数是不一样的;在签名计算阶段则参数都一样。参考以下示例:

  1. /**
  2. *发送消息计算签名(POST)
  3. */
  4. public static String postSign(String secretKey,String topic,String producerId,String body,String date) {
  5. //拼接消息
  6. String signString=topic+NEWLINE+producerId+NEWLINE+ MD5.getInstance().getMD5String(body)+NEWLINE+date;
  7. //计算签名
  8. return calSignature(signString.getBytes(Charset.forName(ENCODE)), secretKey);
  9. }
  10. /**
  11. * 拉取消息计算签名(GET)
  12. */
  13. public static String getSign(String secretKey,String topic,String consumerId,String date){
  14. //拼接消息
  15. String signString=topic+NEWLINE+consumerId+NEWLINE+date;
  16. //计算签名
  17. return calSignature(signString.getBytes(Charset.forName(ENCODE)), secretKey);
  18. }
  19. /**
  20. * 消息删除计算签名(DELETE)
  21. */
  22. public static String deleteSign(String secretKey,String topic,String consumerId,String msgHandle,String date) {
  23. //拼接消息
  24. String signString = topic+NEWLINE+consumerId+NEWLINE+msgHandle+NEWLINE+date;
  25. //计算签名
  26. return calSignature(signString.getBytes(Charset.forName(ENCODE)), secretKey);
  27. }

字符串拼接后计算签名

  1. /**
  2. * 签名计算方式,先使用 HmacSHA1 编码,再使用 Base64 编码
  3. */
  4. public static String calSignature(byte[] data,String secretKey) {
  5. //采用 HmacSHA1 编码
  6. Mac e = Mac.getInstance(HmacSHA1);
  7. //key 转成二进制 UTF-8 编码
  8. byte[] keyBytes = key.getBytes(ENCODE);
  9. e.init(new SecretKeySpec(keyBytes, HmacSHA1));
  10. //采用 HmacSHA1 计算编码结果
  11. byte[] sha1EncodedBytes = e.doFinal(data);
  12. //得到结果后将结果使用 Base64 编码,编码后的结果采用 UTF-8 转换为 String
  13. return new String(Base64.encodeBase64(sha1EncodedBytes), ENCODE);
  14. }
本文导读目录