开发者社区 > 云原生 > 消息队列 > 正文

在MQTT中请问这个计算签名有没有对应的java API?

在MQTT中请问这个计算签名有没有对应的java API?请参考图片:iwEcAqNwbmcDAQTRBjIF0QELBrDceGHLqaN8SAZo04tPqnEAB9IgZnbtCAAJomltCgAL0Uj5.png_720x720q90.jpg

展开
收起
冲冲冲c 2024-07-01 22:15:40 20 0
3 条回答
写回答
取消 提交回答
  • 参考下demo代码。

    /**
     * Signature 鉴权模式下构造方法
     *
     * @param instanceId MQ4IOT 实例 ID,购买后控制台获取
     * @param accessKey 账号 accesskey,从账号系统控制台获取
     * @param clientId MQ4IOT clientId,由业务系统分配
     * @param secretKey 账号 secretKey,从账号系统控制台获取
     */
    public ConnectionOptionWrapper(String instanceId, String accessKey, String secretKey,
        String clientId) throws NoSuchAlgorithmException, InvalidKeyException {
        this.instanceId = instanceId;
        this.accessKey = accessKey;
        this.secretKey = secretKey;
        this.clientId = clientId;
        mqttConnectOptions = new MqttConnectOptions();
        mqttConnectOptions.setUserName("Signature|" + accessKey + "|" + instanceId);
        String user = "Signature|" + accessKey + "|" + instanceId;
        String pwd = Tools.macSignature(clientId, secretKey);
        mqttConnectOptions.setPassword(Tools.macSignature(clientId, secretKey).toCharArray());
        mqttConnectOptions.setCleanSession(true);
        mqttConnectOptions.setKeepAliveInterval(90);
        mqttConnectOptions.setAutomaticReconnect(true);
        mqttConnectOptions.setMqttVersion(MQTT_VERSION_3_1_1);
        mqttConnectOptions.setConnectionTimeout(5000);
    }
    
    /**
     * @param text 要签名的文本
     * @param secretKey 阿里云MQ secretKey
     * @return 加密后的字符串
     * @throws InvalidKeyException
     * @throws NoSuchAlgorithmException
     */
      public static String macSignature(String text,
        String secretKey) throws InvalidKeyException, NoSuchAlgorithmException {
        Charset charset = Charset.forName("UTF-8");
        String algorithm = "HmacSHA1";
        Mac mac = Mac.getInstance(algorithm);
        mac.init(new SecretKeySpec(secretKey.getBytes(charset), algorithm));
        byte[] bytes = mac.doFinal(text.getBytes(charset));
        return new String(Base64.encodeBase64(bytes), charset);
    }
    

    此回答整理来自钉群“阿里云 微消息队列 MQTT产品咨询群”。

    2024-07-02 22:07:16
    赞同 1 展开评论 打赏
  • 北京阿里云ACE会长

    可以使用 Java 加密扩展(Java Cryptography Architecture, JCA)提供的 API 来完成

    KeyGenerator:用于生成密钥对。
    Signature:用于生成或验证数字签名。
    Mac(Message Authentication ```js

    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.Signature;
    import java.security.SignatureException;

    public class SignatureExample {
    public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    // 待签名的消息
    String message = "待签名的 Message ID";
    // 密钥
    String secretKey = "process Key";

        // 创建 Signature 实例,指定使用 HMAC-SHA256 算法
        Signature signature = Signature.getInstance("HmacSHA256");
    
        // 初始化 Signature 对象,传入密钥
        signature.initSign(secretKey);
    
        // 更新待签名的消息
        signature.update(message.getBytes());
    
        // 完成签名过程,获取签名字节
        byte[] signedData = signature.sign();
    
        // 打印签名结果
        System.out.println("签名结果:" + bytesToHex(signedData));
    }
    
    // 辅助方法,用于将字节数组转换为十六进制字符串
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
    

    }```

    2024-07-02 08:45:42
    赞同 展开评论 打赏

多个子产品线联合打造金融级高可用消息服务以及对物联网的原生支持,覆盖多行业。

相关产品

  • 云消息队列 MQ
  • 相关电子书

    更多
    Spring Cloud Alibaba - 重新定义 Java Cloud-Native 立即下载
    The Reactive Cloud Native Arch 立即下载
    JAVA开发手册1.5.0 立即下载