C# NServiceBus:消息级加密
我要求所有消息的内容必须以某种方式加密。对于实际的加密,我可能可以利用内置的X.509加密 但是,我想知道在不必修改消息本身的情况下进行消息级加密的最佳方法是什么(因此没有C# NServiceBus:消息级加密,c#,.net,encryption,nservicebus,C#,.net,Encryption,Nservicebus,我要求所有消息的内容必须以某种方式加密。对于实际的加密,我可能可以利用内置的X.509加密 但是,我想知道在不必修改消息本身的情况下进行消息级加密的最佳方法是什么(因此没有WireEncryptedString)。我可以看到,开发中的最新版本将以IMutateOutgoingMessages、IMutateIncomingMessages和IMapOutgoingTransportMessages的形式对此提供更多支持。特别是最后一个是有趣的,因为它通过了一个流,我将能够对其进行整体加密(对吗?
WireEncryptedString
)。我可以看到,开发中的最新版本将以IMutateOutgoingMessages
、IMutateIncomingMessages
和IMapOutgoingTransportMessages
的形式对此提供更多支持。特别是最后一个是有趣的,因为它通过了一个流
,我将能够对其进行整体加密(对吗?)。我见过使用这种方法,他正确地提到没有IMapIncomingTransportMessages
,那么我如何在不修改NServiceBus代码的情况下对接收方加密的消息进行解密,或者这是目前唯一的选择,直到它得到充实
然而,这是NServiceBus的未来版本,我认为现在在生产场景中使用它不是一个好主意。我将如何在2.0中实现这一点?对我来说,最好的方法似乎是编写一个自定义的EncryptedSerializer
,它被传入IMessageSerializer
,基本上只包装序列化
和反序列化
该IMessageSerializer
的方法
我目前拥有的:
public class EncryptedSerializer : IMessageSerializer
{
[Inject]
public MessageSerializer Serializer { get; set; }
public IMessage[] Deserialize(System.IO.Stream stream)
{
// decrypt magic happens here
return Serializer.Deserialize(stream);
}
public void Serialize(IMessage[] messages, System.IO.Stream stream)
{
Serializer.Serialize(messages, stream);
// encrypt magic happens here
}
}
但我不知道如何设置NServiceBus配置,使其在正确配置/注入的XmlSerializer中传递。我研究了.XmlSerializer()
扩展方法,并尝试复制该方法,但没有成功。理想情况下,我只希望有一个IMessageSerializer
,而不是具体的XML序列化程序,但这不太重要
我在这里使用Ninject和NServiceBus的Ninject对象生成器:gist.github.com/326321。但是我不确定这是否重要。如果您愿意放弃将另一个消息序列化程序注入到您自己的序列化程序中,而只包装具体的XML序列化程序,那么会更容易。您还需要公开其他属性(XML序列化程序上的属性),然后传递这些属性 我知道这并不是特别优雅,这就是为什么我们在下一个版本中改进了可扩展性故事,以允许您插入加密而不必修改序列化程序
尽管如此,您可能不需要在所有端点之间进行加密,而只需要在局域网外通信的端点之间进行加密。对于这些情况,您可以使用NServiceBus附带的网关进程,该进程支持基于HTTP的通信,然后可以配置为通过HTTPS进行通信。此解决方案需要较少的编码,但会在部署中涉及另一个过程。如果您愿意放弃将另一个消息序列化程序注入到您自己的序列化程序中,而只包装具体的XML序列化程序,则会更容易。您还需要公开其他属性(XML序列化程序上的属性),然后传递这些属性 我知道这并不是特别优雅,这就是为什么我们在下一个版本中改进了可扩展性故事,以允许您插入加密而不必修改序列化程序 尽管如此,您可能不需要在所有端点之间进行加密,而只需要在局域网外通信的端点之间进行加密。对于这些情况,您可以使用NServiceBus附带的网关进程,该进程支持基于HTTP的通信,然后可以配置为通过HTTPS进行通信。此解决方案需要更少的编码,但在部署中会涉及另一个过程