本文介绍 HTTP 协议的签名方式,适用于使用 HTTP 协议接入 MQ 的客户端。MQ HTTP 签名流程分为字符串拼接和计算签名两个步骤。
字符串拼接:将协议签名需要的参数列表按照组合方式生成签名前字符串。
计算签名:使用 HmacSHA1 签名算法,用 SecretKey 作为 HmacSHA1 的 Key,计算签名。
签名基本参数说明
- //所有 GET POST DELETE 签名前字符串的拼接使用 \n
- private static final String NEWLINE="\n";
- //签名所有的 byte 使用编码 UTF-8,所有的 string 编码 UTF-8
- private static final String ENCODE = "UTF-8";
- //签名算法 HmacSHA1
- public static final String HmacSHA1 = "HmacSHA1";
HTTP 签名计算
在拼接字符串阶段,HTTP 各个方法所需要的参数是不一样的;在签名计算阶段则参数都一样。参考以下示例:
- /**
- *发送消息计算签名(POST)
- */
- public static String postSign(String secretKey,String topic,String producerId,String body,String date) {
- //拼接消息
- String signString=topic+NEWLINE+producerId+NEWLINE+ MD5.getInstance().getMD5String(body)+NEWLINE+date;
- //计算签名
- return calSignature(signString.getBytes(Charset.forName(ENCODE)), secretKey);
- }
- /**
- * 拉取消息计算签名(GET)
- */
- public static String getSign(String secretKey,String topic,String consumerId,String date){
- //拼接消息
- String signString=topic+NEWLINE+consumerId+NEWLINE+date;
- //计算签名
- return calSignature(signString.getBytes(Charset.forName(ENCODE)), secretKey);
- }
- /**
- * 消息删除计算签名(DELETE)
- */
- public static String deleteSign(String secretKey,String topic,String consumerId,String msgHandle,String date) {
- //拼接消息
- String signString = topic+NEWLINE+consumerId+NEWLINE+msgHandle+NEWLINE+date;
- //计算签名
- return calSignature(signString.getBytes(Charset.forName(ENCODE)), secretKey);
- }
字符串拼接后计算签名
- /**
- * 签名计算方式,先使用 HmacSHA1 编码,再使用 Base64 编码
- */
- public static String calSignature(byte[] data,String secretKey) {
- //采用 HmacSHA1 编码
- Mac e = Mac.getInstance(HmacSHA1);
- //key 转成二进制 UTF-8 编码
- byte[] keyBytes = key.getBytes(ENCODE);
- e.init(new SecretKeySpec(keyBytes, HmacSHA1));
- //采用 HmacSHA1 计算编码结果
- byte[] sha1EncodedBytes = e.doFinal(data);
- //得到结果后将结果使用 Base64 编码,编码后的结果采用 UTF-8 转换为 String
- return new String(Base64.encodeBase64(sha1EncodedBytes), ENCODE);
- }