2017-05-18 2 views
0

Ich benutze MassTransit 3.4 und den EncryptedSerializer. Nachrichten werden von meiner Anwendung korrekt verschlüsselt und entschlüsselt, aber jetzt möchte ich in der Lage sein, die base64-codierten Nachrichten zu decodieren, die in den RabbitMQ-Warteschlangen "_error" angezeigt werden. Ich möchte ein Programm schreiben, um Benutzern zu ermöglichen, den Inhalt der base64-kodierten und verschlüsselten Nachrichten zu entdecken, und ich habe Mühe, die Nachrichten richtig zu dekodieren.Decrypt Base64-codierte RabbitMQ-Nachricht

Hier ist, was ich bisher getan habe. Kopieren Sie die "Payload" -Bits aus der RabbitMQ-Verwaltungsoberfläche in meinen Texteditor und versuchen Sie, Code Convert.FromBase64String (Text) auszuführen, und übergeben Sie dann das Byte-Array an eine Entschlüsselungsfunktion wie die one found here. Das funktioniert fast - ich sehe die meisten Zeichen der Payload im Klartext, aber viele Zeichen sind durcheinander. Ich kann nicht die gesamte Nachrichtennutzlast teilen, aber hier ist ein Screenshot von LinqPad, der einige durcheinandergebrachte Zeichen zeigt (mit roter Farbe, die von mir zum Schutz hinzugefügt wurde). Siehst du die schwarzen komischen Charaktere? Und das führende "g"? Was ist das Problem?

enter image description here

Hier ist ein Code-Snippet ich den entschlüsselten Text zu bekommen bin mit (ich auch verschiedene Kodierungen ohne Erfolg versucht haben):

using (Stream msDecrypt = new MemoryStream(cipherText, false)) 
using (Stream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
using (StreamReader srDecrypt = new StreamReader(csDecrypt, System.Text.Encoding.UTF8, false, 1024, true)) 
{ 
    plaintext = srDecrypt.ReadToEnd(); 
} 

Wenn ich versuche, Masstransit-Stil zu verwenden, Entschlüsselung eines NewtonSoft BsonReader verwenden, erhalte ich „Cryptographic: Padding ungültig ist und nicht entfernt werden kann“, wenn es Entsorgen auf dem Crypto Objekt aufzurufen versucht:

using (Stream msDecrypt = new MemoryStream(cipherText, false)) 
using (Stream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
using (var jsonReader = new BsonReader(csDecrypt)) 
{ 
    envelope = deserializer.Deserialize<MessageEnvelope>(jsonReader); 
} 

Was mache ich hier falsch?

Aktualisieren: Wenn ich in Notepad ++ einfügen, zeigt es eine Vielzahl von Steuerzeichen. Die Zeichenfolge beginnt mit gmessageId (EOT und STX sind Steuerzeichen). Es gibt eine Menge STX-Zeichen - ich denke, dass diese entweder Anführungszeichen oder Doppelpunkte oder etwas sein sollen ... Wie kann ich diese in die richtigen Symbole umwandeln?

+0

Interessant, bist du sicher, dass _should_ kein Steuerzeichen in der Nachricht sein sollte? Trotzdem sieht es nach einem Codierproblem aus – kennyzx

Antwort

0

Der zweite Ansatz ist korrekt; Sie möchten mit BsonReader in eine MassTransit MessageEnvelope-Instanz deserialisieren. Ich wurde mit dem „Cryptographic: Padding ungültig ist und nicht entfernt werden kann“ bekommen, weil ich keine DeserializerSettings ... In der Masstransit Quelle vorging, sie initialisieren Deserializer wie folgt aus:

JsonSerializerSettings DeserializerSettings = new JsonSerializerSettings 
{ 
    NullValueHandling = NullValueHandling.Ignore, 
    DefaultValueHandling = DefaultValueHandling.Ignore, 
    MissingMemberHandling = MissingMemberHandling.Ignore, 
    ObjectCreationHandling = ObjectCreationHandling.Auto, 
    ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor, 
    ContractResolver = new JsonContractResolver(), 
    Converters = new List<JsonConverter>(new JsonConverter[] 
    { 
     new ListJsonConverter(), 
     new InterfaceProxyConverter(GreenPipes.Internals.Extensions.TypeCache.ImplementationBuilder), 
     new IsoDateTimeConverter {DateTimeStyles = System.Globalization.DateTimeStyles.RoundtripKind}, 
    }) 
}; 

var _deserializer = JsonSerializer.Create(DeserializerSettings); 

Früher war ich gerade tun:

var _deserializer = new JsonSerializer(); 

so nach dem Deserializer richtig initialisiert wird, die Deserialisierung der MessageEnvelope funktioniert, und Sie können es wieder zu einem schön wie so formatiert JSON-String, serialisiert:

MassTransit.Serialization.MessageEnvelope envelope; 

using (MemoryStream msDecrypt = new MemoryStream(cipherText)) 
using (Stream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read)) 
using (BsonReader jsonReader = new Newtonsoft.Json.Bson.BsonReader(csDecrypt)) 
{ 
    envelope = _deserializer.Deserialize<MessageEnvelope>(jsonReader); 
} 

string output = JsonConvert.SerializeObject(envelope, Newtonsoft.Json.Formatting.Indented); 
return output; 

Dies setzt MassTransit 3.4, Newtonsoft.Json 9.0.1 (aka Json.NET) und GreenPipes (1.0.6) voraus. Im obigen Code habe ich die vollständigen Namespaces für die Klassen in diesen Bibliotheken hinzugefügt.

Verwandte Themen