开发者社区> 问答> 正文

如何制作HTTP 签名?


本文介绍 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. }

展开
收起
猫饭先生 2017-10-27 10:12:37 1592 0
0 条回答
写回答
取消 提交回答
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里巴巴HTTP 2.0实践及无线通信协议的演进之路 立即下载
CDN助力企业网站进入HTTPS时代 立即下载
低代码开发师(初级)实战教程 立即下载