Pulsar Encryption
Pulsar使用动态生成的对称AES秘钥来加密消息(数据)。 AES 秘钥(数据秘钥) 使用应用程序提供的 ECDSA/RSA 秘钥来加密,因此没有必要与所有人共享秘钥。
Key is a public/private key pair used for encryption/decryption. The producer key is the public key, and the consumer key is the private key of the key pair.
应用程序用公钥配置生产者。 这个密钥用于加密 AES 数据密钥。 加密数据秘钥作为消息头部的一部分发送。 只有拥有私钥的实体(例子中的消费者) 才能解密用于解密消息的数据秘钥。
Pulsar does not store the encryption key anywhere in the pulsar service. If you lose/delete the private key, your message is irretrievably lost, and is unrecoverable
生产者(Producer)
操作步骤:
- 创建 ECDSA 或者 RSA 公钥/私钥对。
- 将公钥和私钥添加到秘钥管理中,并且配置你的生产者去得到公钥,消费者去得到私钥。
- 生产者实现 CryptoKeyReader::getPublicKey() 接口,消费者实现 CryptoKeyReader::getPrivateKey() 接口,Pulsar 客户端会调用这两个接口加载秘钥。
- 生产者配置加密秘钥:conf.addEncryptionKey(“myapp.key”)
- 生产者/消费者配置 CryptoKeyReader 的实现:conf.setCryptoKeyReader(keyReader)
- 生产者代码示例:
- 简单的消费者示例
生产者程序启用加密:
如果生产和消费的程序不是同一个, 你需要确保消费者能够访问能够解密消息的私钥。 This can be done in two ways:
- 你可以授权对 producer 使用的某个秘钥的访问权。
在某些情况下,生产者可能想要用多个密钥加密消息。 For this, add all such keys to the config. Consumer will be able to decrypt the message, as long as it has access to at least one of the keys.
例如:如果消息需要使用如下两个秘钥加密: myapp.messagekey1 和 myapp.messagekey2,
失败处理:
- 生产者/消费者无法访问秘钥
- 生产者将会操作失败,并提示失败的原因。 在这种情况下,应用可以选择继续发送未加密的消息。 通过配置 conf.setCryptoFailureAction(ProducerCryptoFailureAction) 来控制失败后的后续动作。 默认的行为是请求失败。
- 如果消费者因为解密失败或者丢失秘钥导致消费失败,应用程序可以选择消费加密的消息或者丢弃它。 通过配置 conf.setCryptoFailureAction(ConsumerCryptoFailureAction) 来控制失败后的后续动作。 默认的行为是请求失败。 如果私钥永久丢失,应用将永远不能解密消息。
- 批量消息
- 如果消息包含有批量消息,并且解密失败,客户端将会无法在在批次中搜索单独的消息。即使将 conf.setCryptoFailureAction() 设置为 CONSUME,消息消费还是会失败。
- 如果解密失败,消息消费将会停止,应用程序会在客户端日志中记录解密失败的信息,并且会观察到积压的增长。 如果应用无法使用秘钥去解密消息,唯一的选项是跳过/丢弃已经积压的消息。