【问题标题】:Decrypt Base64-encoded RabbitMQ message解密 Base64 编码的 RabbitMQ 消息
【发布时间】:2017-05-18 02:19:12
【问题描述】:

我正在使用 MassTransit 3.4 和 EncryptedSerializer。消息由我的应用程序正确加密和解​​密,但现在我希望能够解码出现在 RabbitMQ“_error”队列中的 base64 编码消息。我想编写一些程序来让用户发现 base64 编码和加密消息的内容,我正在努力正确解码消息。

这是我到目前为止所做的。将 RabbitMQ 管理 UI 中的“有效负载”位复制/粘贴到我的文本编辑器中,并尝试将代码运行到 Convert.FromBase64String(text),然后将字节数组传递给像 one found here 这样的解密函数。这几乎可以工作 - 我看到 Payload 的大部分字符都是纯文本,但很多字符都搞砸了。我无法共享整个消息负载,但这是来自 LinqPad 的屏幕截图,显示了一些混乱的字符(我添加了红色以进行保护)。看到黑色奇怪的字符了吗?和领先的“g”?有什么关系?

这是我用来获取解密文本的代码 sn-p(我也尝试了不同的编码但无济于事):

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();
}

如果我尝试使用 NewtonSoft BsonReader 使用 MassTransit 式解密,当它尝试对 CryptoStream 对象调用 Dispose 时,我会收到“CryptographicException:填充无效并且无法删除”:

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);
}

我在这里做错了什么?

更新:如果我粘贴到 Notepad++ 中,它会显示很多控制字符。该字符串以 gmessageId 开头(EOT 和 STX 是控制字符)。有很多 STX 字符 - 我认为这些应该是引号或冒号之类的......我怎样才能将它们转换为正确的符号?

【问题讨论】:

  • 有趣,你确定应该在消息中没有控制字符吗?仍然看起来像一个编码问题

标签: c# encryption rabbitmq masstransit


【解决方案1】:

第二种方法是正确的;您想使用 BsonReader 将其反序列化为 MassTransit MessageEnvelope 实例。我收到“CryptographicException: Padding is invalid and cannot be removed”,因为我没有传递任何 DeserializerSettings... 在 MassTransit 源中,它们初始化反序列化器,如下所示:

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);

以前,我只是在做:

var _deserializer = new JsonSerializer();

所以在正确初始化反序列化器后,MessageEnvelope 的反序列化就可以工作了,您可以将其序列化回 Json 字符串,格式如下:

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;

假设 MassTransit 3.4、Newtonsoft.Json 9.0.1(又名 Json.NET)和 GreenPipes (1.0.6)。在上面的代码中,我为这些库中的类添加了完整的命名空间。

【讨论】:

    猜你喜欢
    • 2019-04-27
    • 2018-03-13
    • 1970-01-01
    • 2018-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 2018-09-07
    相关资源
    最近更新 更多