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

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

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

展开
收起
冲冲冲c 2024-07-01 22:15:40 62 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
    赞同 1 展开评论 打赏

涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/

相关产品

  • 云消息队列 MQ
  • 热门讨论

    热门文章

    相关电子书

    更多
    Spring Boot2.0实战Redis分布式缓存 立即下载
    CUDA MATH API 立即下载
    API PLAYBOOK 立即下载