简体   繁体   English

解密Kafka Avro消息

[英]Decrypt Kafka Avro Message

I am trying to parse a kafka message, it's in some encrypted AVRO format. 我正在尝试解析kafka消息,它采用某种加密的AVRO格式。 I have the following AvroSchema.avsc avro schema file: 我有以下AvroSchema.avsc avro模式文件:

{
    "type": "record",
    "namespace": "kafka.events",
    "name": "AvroSchema",
        "fields": [
            { "name": "product_id", "type": "string" },
            { "name": "available_to_promise_quantity", "type": "double" },
            { "name": "online_available_to_promise_quantity", "type": "double" },
            { "name": "stores_available_to_promise_quantity", "type": "double" },
            { "name": "is_infinite_inventory", "type": "boolean", "default" : false },
            { "name": "event_timestamp", "type": "long" },
            { "name": "previous_event", "type": "AvroSchema" }
        ]
 }

Now, I have written the following code to get the data in JSON format: 现在,我编写了以下代码以JSON格式获取数据:

for (final KafkaStream<byte[], byte[]> stream : streams){
    ConsumerIterator<byte[], byte[]> consumerIterator = stream.iterator();
    byte[] consumedEncryptedMessage;
    MessageAndMetadata<byte[], byte[]> consumedEntry;
    while(consumerIterator.hasNext()){
        consumedEntry = consumerIterator.next();
            if(null != consumedEntry){
                consumedEncryptedMessage = consumedEntry.message();
                    try {
                            Schema schema = null;
                            schema = new Schema.Parser().parse(new File("src/AvroSchema.avsc"));
                            DatumReader<GenericRecord> reader = new SpecificDatumReader<GenericRecord>(schema);
                            Decoder decoder = DecoderFactory.get().binaryDecoder(consumedEncryptedMessage , null);
                            GenericRecord decryptedmsg = null;
                            decryptedmsg = reader.read(null, decoder);
                            System.out.println(decryptedmsg);
                        }
                        catch(Exception e) {
                            e.printStackTrace();
                            System.out.println(e);
                        }

Please help me how to decrypt the message. 请帮助我如何解密邮件。

The encrypted byte message is of this type: 080-21-0001 : Aw @@ A ǐ U : Aw @@ A 加密的字节消息具有以下类型: 080-21-0001 : Aw @@ A ǐ U : Aw @@ A

I made the changes as suggested, and now i have following piece of code: 我按照建议进行了更改,现在有以下代码:

while(consumerIterator.hasNext()){
    consumedEntry = consumerIterator.next();
        if(null != consumedEntry){
            consumedEncryptedMessage = consumedEntry.message();
                try {
                    Schema schema = new Schema.Parser().parse(new File("src/AVROSchema.avsc"));
                    File myfile = new File("/Users/z001ldc/Desktop/myfile.txt");
                    DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(schema);
                    FileUtils.writeByteArrayToFile(myfile, consumedEncryptedMessage);
                    @SuppressWarnings("resource")
                    DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(myfile, reader);
                    while (dataFileReader.hasNext()) {
                        decryptedMessage = dataFileReader.next(decryptedMessage);
                        System.out.println(decryptedMessage.get("product_id").toString());
                    }
                }
                catch(Exception e) {
                    e.printStackTrace();
                    System.out.println(e);
                }

But still I am getting the error as "Not a data file". 但是,我仍然收到错误提示为“不是数据文件”。

Deserializing wont require decryption 反序列化不需要解密

First you get your schema line 首先,您获得了架构行

schema = new Schema.Parser().parse(new File("src/AvroSchema.avsc"));
DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(schema);

Then 然后

DataFileReader<GenericRecord> dataFileReader = new DataFileReader<GenericRecord>(consumedEncryptedMessage, reader);
GenericRecord user = null;
while (dataFileReader.hasNext()) {
// Reuse user object by passing it to next(). This saves us from
// allocating and garbage collecting many objects for files with
// many items.
user = dataFileReader.next(user);
System.out.println(user);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 Kafka Avro 反序列化器无法将 Kafka 消息反序列化为特定的 Avro 记录 - Kafka Avro Deserializer is not able to deserialize the Kafka message to Specific Avro Record 错误序列化 Avro 消息 - Kafka Schema Registry - Error serializing Avro message - Kafka Schema Registry 用于多个主题的 kafka Avro 消息解串器 - kafka Avro message deserializer for multiple topics 从JDBC Connector反序列化avro kafka消息时出错 - Error deserialising avro kafka message from JDBC Connector 使用 Apache Avro 但具有不同架构的 kafka 发送/接收消息 - Send / Receive message through kafka using Apache Avro but with different schema 将 spark sql 2.4.4 数据帧中的 Avro 类型消息生成到 Kafka - Producing Avro type message in spark sql 2.4.4 data frame to Kafka 带有AVRO的Apache kafka,架构ID在消息中的哪里? - Apache kafka with AVRO, where in the message does the schema id go? 如何使用 Avro 序列化程序和架构注册表向 Kafka 发送消息 - How to send message to Kafka with Avro serializer and schema registry Java 中的 SDK Kafka - 如何正确读取 AVRO 编码消息 - SDK Kafka in Java - How proper read an AVRO encoded message 如何在不知道 avro 模式的情况下在 Scala 中读取 Avro 编码的 kafka 消息? - How to read Avro Encoded kafka message in scala without knowing avro schema?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM