【问题标题】:How to encrypt msmq messages?如何加密 msmq 消息?
【发布时间】:2016-01-21 11:09:43
【问题描述】:

在我的实习中,我正在制作一个使用 MSMQ 发送消息的应用程序。目前一切正常,除了加密。 (私人数据)

应用程序将自定义对象的列表发送到服务器,并从服务器检索它。但是当我使用: message.UseEncryption = true;单元测试不会运行。

我的代码:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Messaging;
using System.Text;
using System.Threading.Tasks;

namespace MSMQClient
{
    public class ClientManager
    {
        public bool connected { get; private set; }
        public string queueLocation { get; private set; }

        public Message message { get; private set; }
        public MessageQueue messageQueue { get; private set; }
        public List<DataContracts.MemoryTransaction> notSentTransactions { get; private set; }

        public ClientManager()
        {
            queueLocation = @".\private$\testqueue";

            if (MessageQueue.Exists(queueLocation))
            {
                MessageQueue.Delete(queueLocation);
            }

            messageQueue = MessageQueue.Create(queueLocation);
            //messageQueue.EncryptionRequired = EncryptionRequired.Body;
        }

        public bool isConnected()
        {
            if (messageQueue != null)
            {
                return true;
            }
            return false;
        }

        public bool sendToServer(List<DataContracts.MemoryTransaction> memoryTransactions)
        {
            try
            {
                message = new Message();

                message.Formatter = new XmlMessageFormatter(new Type[] { typeof(List<DataContracts.MemoryTransaction>) });

                //message.UseEncryption = true;

                message.Body = memoryTransactions;
                message.Label = "MemoryTransList";
                message.Priority = MessagePriority.Normal;

                messageQueue.Send(message);
                return true;
            }
            catch (Exception ex)
            {
                Cocosoft.SDK.Logging.TextLogging(ex.ToString());

                notSentTransactions = memoryTransactions;

                return false;
            }
        }
    }

我找到this site 并尝试了很多,但我无法让它工作...... 我想我必须使用接下来的东西:

public bool sendToServer(List<DataContracts.MemoryTransaction> memoryTransactions)
{
    try
    {
        message = new Message();
        message.Body = ... //memoryTransactions
        message.Label = ... //"MemoryTransList"
        message.Priority = ... //Priority.Normal
        message.Formatter = ... //new XmlMessageFormatter(new Type[] { typeof(List<DataContracts.MemoryTransaction>) });
        message.UseEncryption = ... //true
        message.ConnectorType = ... //???
        message.EncryptionAlgorithm = ... //EncryptionAlgorithm.Rc2
        message.DestinationSymmetricKey = ...//???

        messageQueue.Send(message);
        return true;
    }
    catch (Exception ex)
    {
        notSentTransactions = memoryTransactions;
        return false;
    }
}

谁能帮帮我?我错过了什么吗?

但 Cocosoft SDK 将其保存在一个 logging.txt 中:

翻译:指定的格式名称不支持请求的操作。例如,不能删除直接队列格式名称。

System.Messaging.MessageQueueException (0x80004005): De opgegeven indelingsnaam ondersteunt de gevraagde bewerking niet. Een directe wachtrij-indelingsnaam kan bijvoorbeeld niet worden verwijderd.
   bij System.Messaging.MessageQueue.SendInternal(Object obj, MessageQueueTransaction internalTransaction, MessageQueueTransactionType transactionType)
   bij System.Messaging.MessageQueue.Send(Object obj)
   bij MSMQClient.ClientManager.sendToServer(List`1 memoryTransactions) in d:\StageGeert\UnitTestStage\MSMQClient\ClientManager.cs:regel 96

【问题讨论】:

  • 翻译错误消息给出“没有足够的资源可用于执行操作。”。这似乎与加密无关。看看这个:support.microsoft.com/en-us/kb/899613
  • 嗯,但是当我不使用加密时它可以工作。无论如何,谢谢你的帮助!
  • 加密导致数据包太大而无法发送到服务器是可能。我对 MSMQ 了解不多,但对我来说,错误似乎不是由加密引起的,而是加密触发了其他一些问题。您是否能够发送带有加密的小消息,只是为了测试?还是超大的未加密消息?
  • 是的,我有一个包含 500 个项目的列表,无需加密即可使用。但是当我使用列表中的 10 个项目,甚至 1 个项目时,它也会失败:(

标签: c# encryption msmq


【解决方案1】:

在 MSMQ 的计算机管理控制台中有一个复选框,用于设置消息存储限制。也许加密正在强制消息超出此存储限制。您可以尝试取消选中存储限制复选框以查看是否可以正确发送消息吗?

【讨论】:

  • 不幸的是已经这样做了......即使是这样,我也不相信只加密一个简单的字符串会很大......
【解决方案2】:

我找到了解决办法!我使用的是本地版本的 MSMQ。但是我必须在 Azure 中实现,所以我使用了 Azure 服务总线。这与本地消息队列有点不同。但是多亏了 Azure 服务总线,问题就迎刃而解了!微软干得好!

【讨论】:

    【解决方案3】:

    如果你设置了 message.UseEncryption = true;目标队列的隐私级别必须是“正文”或“可选”。如果目标队列的隐私级别为“无” - 它将拒绝加密消息。 https://msdn.microsoft.com/ru-ru/library/ms700286(v=vs.85).aspx

    【讨论】:

      猜你喜欢
      • 2010-10-22
      • 1970-01-01
      • 2021-04-21
      • 2011-07-27
      • 2010-12-10
      • 2011-06-22
      • 1970-01-01
      • 2010-11-05
      • 2018-02-20
      相关资源
      最近更新 更多