在MQTT中请问这个计算签名有没有对应的java API?请参考图片:
参考下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产品咨询群”。
示例
以DescribeRegionsAPI为例,假设使用的AccessKeyId为testid,AccessKey Secret为testsecret。签名前的请求URL如下:
OLeaidS1JvxuMvnyHOwuJ+uX5qY=
最后将签名作为Signature参数加入到URL请求中,最后得到的URL为:
可以使用 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();
}
}```
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/