MSMQ。将邮件正文存储在驱动器上时对其进行加密

MSMQ. Keep message body encrypted while it is stored on drive

我的项目要求对所有数据进行加密,因此 MSMQ 也需要加密。但正如从文章 (https://msdn.microsoft.com/en-us/library/ms704178(v=vs.85).aspx ) 中得知的那样,来自私有队列的消息默认存储在 …\MSMQ\Storage\p000000x.mq 文件中。

当我配置私有队列时,将其隐私级别设置为 "Body",当我向该队列发送加密消息时,然后我在文本查看器中打开...\MSMQ\Storage\p000000x.mq 文件(我使用 Far Manager 十六进制编辑器),我看到了消息的纯文本。它没有加密。要发送消息,我使用下一个代码:

message.UseEncryption = true;
message.EncryptionAlgorithm = EncryptionAlgorithm.Rc2;

消息 …\MSMQ\Storage\p000000x.mq 保持明文,尽管指定了消息加密。见下图。

所以我的问题是:是否有一些内置工具可以在 …\MSMQ\Storage\p000000x.mq 文件中对驱动器上的消息进行加密?或者我需要在发送到队列之前加密消息体,然后,当从队列中查看时,我需要解密它?

非常感谢!

是的,您需要在将数据放入消息之前加密数据,然后在阅读消息之后解密数据。

"Using Application Encryption on the Data" http://blogs.msdn.com/b/johnbreakwell/archive/2008/09/12/sending-encrypted-msmq-messages.aspx

因为 Microsoft Windows 通过 NTFS Encrypting File System (EFS) 支持多个用户的文件夹加密†,我能够利用这种透明加密机制来支持 MSMQ 存储文件夹的加密,从而最大限度地减少用户访问文件内部数据的表面区域,这些文件包含消息正文和 *.mq 文件中其他可读文本的片段。

这个解决方案是我为私有队列(没有域集成)设计的一种替代方案,可以透明加密,而不需要诉诸 Application-Encrypted Messages 或应用程序自定义加密.它实际上会影响系统上的所有队列,因为 MSMQ 实例的整个存储位置都是加密的。

此解决方案继续允许使用 MSMQ 管理单元查看队列中已分配权限的用户的消息,而不会在查看器中看到乱码或加密文本。

Note that this solution asks you to make a new storage location on disk for the MSMQ because I had issues when trying to encrypt and convert the default storage location which is under Windows/System32. If you find a way to make this solution work without creating a new folder please post in the comments.

这些是我为使 EFS 技术适用于透明加密的 MSMQ 解决方案而采取的步骤:
(此信息假定您知道在哪里可以找到 Message Queue Manager 来配置服务,以及如何执行一些其他基本 Windows 管理任务或了解如何执行此操作)

  1. 以管理员身份登录机器(假设消息队列服务已经安装,如果没有,则从 Windows 程序和功能安装)。

  2. 记下消息队列服务 运行 下的用户帐户(即网络服务)。您将在接下来的步骤中需要它...

  3. 在磁盘上为 msmq 创建一个备用存储文件夹,例如C:\msmq-存储

  4. 将您的管理员用户分配给具有完全控制权限的新文件夹。

  5. 还分配服务用户帐户(在第 2 步中注明,例如网络服务)对文件夹的完全控制权限。
    这是非常重要的一步,因为它使 MSMQ 服务用户帐户可以访问消息文件的加密内容。

  6. 通过转到其属性并启用“加密”复选框来加密文件夹。该文件夹现已加密,可能会以不同的颜色显示。
    您可以通过在计算机上以不同用户身份登录并尝试访问加密文件的内容来测试这一点,从而产生 'Access denied' 消息。

  7. 现在使用 MSMQ 管理器将其存储位置(全部)重新指向您刚刚在磁盘上创建的新加密文件夹(并且远离默认或当前存储位置是)。更改将提示您重新启动服务。说是。

如果您发现此解决方案有任何问题,请在评论中post。谢谢你。

我在 Win 7 工作站和 Windows 2008 R2 服务器上测试了这个解决方案,方法是使用 this article about how to write a bare minimum message queue app 中概述的基本 .NET 应用程序写入和读取队列.