关于生成连接MQTT参数的问题

我想用MQTT客户端进行收发的测试,但是根据文档上的描述计算出的计算出的结果与文档中提供的结果不相符,请帮我看一下是哪里有问题,谢谢啦!

我计算的结果:
hmacsha1 : +v2Co9YCs3+w+ot4kvJKR3+FGhQ=
clientId : 12345|securemode=3,signmethod=hmacsha1,timestamp=789|
username : device&pk
password : 2B7632436F39594373332B772B6F74346B764A4B52332B464768513D

代码:
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import org.apache.commons.codec.binary.Base64;

public class Test 
{
 private static final String HMAC_SHA1_ALGORITHM = "HmacSHA1";
 
 public static String hmacsha1(String key, String data) {
  byte[] result = null;
  try {
   //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称  
   SecretKeySpec signinKey = new SecretKeySpec(key.getBytes(), HMAC_SHA1_ALGORITHM);
   //生成一个指定 Mac 算法 的 Mac 对象  
   Mac mac = Mac.getInstance(HMAC_SHA1_ALGORITHM);
   //用给定密钥初始化 Mac 对象  
   mac.init(signinKey);
   //完成 Mac 操作   
   byte[] rawHmac = mac.doFinal(data.getBytes());
   result = Base64.encodeBase64(rawHmac);
 
  } catch (NoSuchAlgorithmException e) {
   System.err.println(e.getMessage());
  } catch (InvalidKeyException e) {
   System.err.println(e.getMessage());
  }
  if (null != result) {
   return new String(result);
  } else {
   return null;
  }
 }
 
 public static String convert2HexString(String s) {
     String str = "";
     for (int i = 0; i < s.length(); i++) {
         int ch = (int) s.charAt(i);
         String s4 = Integer.toHexString(ch);
         str = str + s4;
     }
     return str;
 }
 
    public static void main( String[] args )
    {
     // 三元
     String deviceName = "device";
     String deviceSecret = "secret";
     String productKey = "pk";
     
     // 配置信息
     String clientId = "12345";
     String signmethod = "hmacsha1";
     int securemode = 3;
     int timestamp = 789;
     
     String content = String.format("clientId%sdeviceName%sproductKey%stimestamp%d", clientId, deviceName, productKey, timestamp);
     
     String mqttclientId = String.format("%s|securemode=%d,signmethod=%s,timestamp=%d|", clientId, securemode, signmethod, timestamp);
     String username = String.format("%s&%s", deviceName, productKey);
     String sha1 = hmacsha1(deviceSecret, content);
     String password = convert2HexString(sha1).toUpperCase();
     
     // 显示输出
     System.out.println("hmacsha1 : " + sha1);
     System.out.println("clientId : " + mqttclientId);
     System.out.println("username : " + username);
     System.out.println("password : " + password);

    }
}

展开
收起
猿长大人 2018-11-10 14:38:38 1162 分享 版权
阿里云 AI 助理回答

看起来你可能是在尝试使用MQTT协议进行安全连接,并且在计算HMAC-SHA1签名时遇到了问题。为了帮助你解决这个问题,我需要一些额外的信息和澄清几个关键点:

  1. 计算HMAC-SHA1的密钥:确保你使用的密钥是正确的。通常,这个密钥是由服务提供方(如阿里云物联网平台)分配给你的设备的,需要用来生成签名。

  2. 消息体内容:HMAC-SHA1签名通常是基于一个特定的消息体内容和密钥计算出来的。请确认你用于计算HMAC的字符串是否完全符合文档要求,包括所有必要的参数及其格式。例如,timestampsecuremode等字段的值和顺序是否正确。

  3. 编码方式:确保你在计算HMAC之前和之后对字符串进行了正确的编码处理。通常,这涉及到将字符串转换为字节流,然后计算HMAC,最后可能还需要对结果进行Base64编码。

  4. 计算工具或库:如果你使用的是某种编程语言的库来计算HMAC-SHA1,确保该库是可靠的,并且你调用它的方法是正确的。不同的库可能有不同的API调用方式。

  5. 比较结果:注意,即使计算过程无误,由于Base64编码可能存在多种变体(虽然差异很小),导致计算出的签名在视觉上可能与示例中的有所不同,但它们实际上是等效的。确保你比较的是有效等价的Base64字符串。

针对你提供的信息,这里有几个检查点: - 你给出的HMACSHA1结果 v2Co9YCs3 w ot4kvJKR3 FGhQ= 中包含空格,这在Base64编码中是不常见的。请确认计算过程中没有意外地引入了空格或其他非标准字符。 - clientId 的格式似乎正确,但请再次确认timestampsecuremode的值以及它们之间的分隔符是否与阿里云物联网平台的要求一致。 - username 直接设置为device,这通常取决于平台的具体配置。如果文档中有指定特定的用户名格式,请按照其指示操作。

建议步骤: - 仔细核对阿里云物联网平台的官方文档,特别是关于如何构造签名字符串和计算HMAC-SHA1的部分。 - 使用官方推荐的SDK或经过验证的库来辅助完成这些步骤,以减少手动计算的错误。 - 如果问题依旧,考虑直接联系阿里云技术支持获取更具体的指导。

如果有具体计算代码或者更多细节可以分享,我可能能提供更针对性的帮助。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答

物联网领域前沿技术分享与交流

收录在圈子:
+ 订阅
致力于实现万物互联的美好世界,为生态合作伙伴提供基于云计算、大数据、人工智能、云端一体化、安全的物联网基础平台和内容服务平台。
还有其他疑问?
咨询AI助理