RocketMQ支持消息加密功能,可以对消息体进行加密传输和存储。这可以确保消息的机密性和完整性。
RocketMQ的消息加密主要依赖于OpenSSL来实现对称加密算法。主要涉及的对象有:
- MessageEncryptHelper:消息加密助手类,用于实现消息的加密与解密。
- DefaultMQProducer:默认生产者,调用MessageEncryptHelper来对消息加密。
- DefaultLitePullConsumer:默认的Lite消费者,调用MessageEncryptHelper来对消息解密。
- KeyManagementService:密钥管理服务,用于管理对称加密所需要的密钥。
消息加密的主要流程:
- 生产者从KeyManagementService获取 AES加密算法的密钥。
- 生产者使用 MessageEncryptHelper 和密钥对消息体进行加密,产生加密内容和初始化向量IV。
- 生产者将加密内容、IV和密钥的keyId一起发送到Broker。
- Broker调用MessageEncryptHelper使用密钥keyId从KeyManagementService获取对应AES密钥。
- Broker使用AES密钥和IV将加密内容解密为消息体,然后将消息体存储或投递给消费者。
- 消费者从KeyManagementService获取AES密钥keyId对应的密钥。
- 消费者使用MessageEncryptHelper和密钥将加密内容解密为消息体并消费。
代码示例:
// 生产者加密消息
byte[] key = KeyManagementService.getKey(keyId);
byte[] encryptContent = MessageEncryptHelper.encrypt(msgBody, key);
byte[] iv = MessageEncryptHelper.generateIV();
Message message = new Message(topic, msgBody);
message.putUserProperty(MessageConst.PROPERTY_ENCRYPT_CONTENT, encryptContent);
message.putUserProperty(MessageConst.PROPERTY_ENCRYPT_IV, iv);
message.putUserProperty(MessageConst.PROPERTY_ENCRYPT_KEYID, keyId);
producer.send(message);
// 消费者解密消息
byte[] key = KeyManagementService.getKey(keyId);
byte[] encryptContent = message.getProperties().get(MessageConst.PROPERTY_ENCRYPT_CONTENT);
byte[] iv = message.getProperties().get(MessageConst.PROPERTY_ENCRYPT_IV);
byte[] msgBody = MessageEncryptHelper.decrypt(encryptContent, key, iv);