欢迎您访问我爱IT技术网,今天小编为你分享的编程技术是:【实现MSMQ消息加密的安全实践】,下面是详细的分享!
实现MSMQ消息加密的安全实践
消息加密的工作原理
消息应用程序发送方对消息进行加密后发送到目标计算机的消息队列中,然后由目标计算机上的应用程序接收消息队列中的消息进行解密。消息加密旨在防止在传输过程中有人未经授权查看消息。
使用消息加密会降低性能,不过这没有使用消息验证时性能下降得那么多。将加密的消息发送到多个不同的计算机时,由加密引起的性能下降非常明显。但是,将多条消息发送到同一目标计算机上时,只有发送第一条消息所花费的时间明显比平常发送的时间长。
要了解消息吞吐量降低的原因,那么了解消息队列使用的加密机制就很重要。
在源计算机上,消息队列执行下列操作:
创建密钥。
使用密钥加密消息正文。
使用目标计算机的公钥加密此密钥。
将加密的密钥附加到加密的消息中。
在目标计算机上,消息队列执行下列操作:
使用其私钥(在密钥对中)解密密钥。
使用密钥解密消息正文。
密钥可用于加密和解密两个方面,因此它们被称为是对称的。公钥只能用于加密,而私钥只能用于解密。
由于非对称密钥加密比对称的密钥加密需要更高的开销。因此采用类似SSL加密机制,使用非对称加密算法加密对成加密使用的密钥,用对称加密算法加密需要发送的消息;解密的时候先使用非对称解密算法解密对称加密时使用的密钥,然后用的得到密钥来解密消息。
技术实现
创建x509证书
X509证书用于非对称加密
证书的来源可以通过安装证书服务获取也可以通过命令生成
生成证书的命令如下
makecert -r -pe -n "CN=x509Signature" -b 01/01/2005 -e 01/01/2010 -sky exchange -ss my -sr localmachine
获取证书的方法
static X509Certificate2 GetCertificate()
{
X509Store store=new X509Store(StoreName.My, StoreLocation.LocalMachine);
store.Open(OpenFlags.ReadOnly);
X509Certificate2 cert=null;
X509Certificate2Collection certCollection=store.Certificates;
foreach (X509Certificate2 x509 in certCollection)
{
if (x509.Thumbprint.Equals(thumbPrint.ToUpper()))
{
cert=x509;
break;
}
}
if (cert==null)
{
store.Close();
throw new ArgumentNullException(string.Format("The X.509 certificate (ThumbPrint: {0} ) could not be found. ", thumbPrint), "error");
}
store.Close();
return cert;
}
使用证书实现非对称加密/解密的代码如下
//非对称加密密钥
static byte[] RSAEncrypt(byte[] enkey, X509Certificate2 Certificate)
{
RSACryptoServiceProvider RSA=Certificate.PublicKey.Key as RSACryptoServiceProvider;
return RSA.Encrypt(enkey, false);
}
//非对成解密密钥
static byte[] RSADecrypt(byte[] context, X509Certificate2 Certificate)
{
RSACryptoServiceProvider RSA=Certificate.PrivateKey as RSACryptoServiceProvider;
return RSA.Decrypt(context, false);
}
使用证书的公钥加密,使用证书的私钥解密
加解密方法
使用对称加密算法进行消息的加密和解密,代码如下:
//对称加密消息内容
static byte[] Encrypt(SymmetricAlgorithm RC2, string bodystring)
{
MemoryStream ms=new MemoryStream();
CryptoStream encStream=new CryptoStream(ms, RC2.CreateEncryptor(), CryptoStreamMode.Write);
StreamWriter sw=new StreamWriter(encStream);
sw.WriteLine(bodystring);
sw.Close();
encStream.Close();
byte[] buffer=ms.ToArray();
ms.Close();
return buffer;
}
//对称解密消息内容
static string Decrypt(byte[] CypherText, SymmetricAlgorithm RC2)
{
MemoryStream ms=new MemoryStream(CypherText);
CryptoStream encStream=new CryptoStream(ms, RC2.CreateDecryptor(), CryptoStreamMode.Read);
StreamReader sr=new StreamReader(encStream);
string val=sr.ReadLine();
sr.Close();
encStream.Close();
ms.Close();
return val;
}
发送加密消息
static void Send()
{
MessageQueue mq=new MessageQueue(DestinationQueue);
//mq.EncryptionRequired=EncryptionRequired.Body;
//mq.FormatName=new BinaryMessageFormatter();
Message message=new Message();
//采用二进制序列化
message.Formatter=new BinaryMessageFormatter();// new XmlMessageFormatter(new Type[] { typeof(string) });
//获取x509证书
X509Certificate2 certificate=GetCertificate();
//使用x509证书非对称加密对称加密密钥
RC2CryptoServiceProvider RC2=new RC2CryptoServiceProvider();
byte[] key=RSAEncrypt(RC2.Key, certificate);
byte[] iv=RSAEncrypt(RC2.IV, certificate);
byte[] extarry=new byte[256];
key.CopyTo(extarry, 0);
iv.CopyTo(extarry, 128);
//保存使用非对称加密后的对称加密密钥
message.Extension=extarry;
//message.DestinationSymmetricKey=RSAEncrypt(RC2.Key, certificate);
//设定使用非对称加密的证书
//message.DigitalSignature=certificate.RawData;
message.SenderCertificate=certificate.RawData;
message.UseEncryption=false;
//message.AcknowledgeType=AcknowledgeTypes.PositiveReceive | AcknowledgeTypes.PositiveArrival;
//message.AdministrationQueue=new MessageQueue(@"thinkpad-t400\private$\myAdministrationQueue");
//message.UseJournalQueue=true;
message.UseDeadLetterQueue=true;
//设定对消息体对称加密算法
message.EncryptionAlgorithm=EncryptionAlgorithm.Rc2;
//message.ConnectorType=new Guid("1E9A03C5-A9B5-4BF6-B0CB-CCB313275285");
message.Label=Guid.NewGuid().ToString();
//生成同步加密key
//MD5CryptoServiceProvider hashmd5=new MD5CryptoServiceProvider();
//SHA256CryptoServiceProvider hsa=new SHA256CryptoServiceProvider();
//byte[] keyArray=hsa.ComputeHash(System.Text.Encoding.ASCII.GetBytes(DestinationSymmetricKey));
//message.HashAlgorithm=System.Messaging.HashAlgorithm.Sha;
// RC2.Key=keyArray;
//使用RC2算法进行加密
byte[] enarry=Encrypt(RC2, BodyString);
string base64=Convert.ToBase64String(enarry);
message.Body=enarry;
//message.SecurityContext=new SecurityContext();
Console.WriteLine("send encrypt message \r\n" + BodyString);
mq.Send(message, MessageQueueTransactionType.Single);
}
接收加密的消息
static void Receive()
{
MessageQueue mq=new MessageQueue(DestinationQueue);
//设定读取消息中证书,扩展属性中加密过的解密密钥
mq.MessageReadPropertyFilter.DestinationSymmetricKey=true;
mq.MessageReadPropertyFilter.Extension=true;
mq.MessageReadPropertyFilter.SenderCertificate=true;
mq.MessageReadPropertyFilter.DigitalSignature=true;
Message message=mq.Receive(MessageQueueTransactionType.Single);
message.Formatter=new BinaryMessageFormatter();
//获取证书
byte[] cert=message.SenderCertificate;
X509Certificate2 x509=new X509Certificate2(cert);
x509=GetCertificateBySubject(x509.Subject);
Console.WriteLine(x509.Thumbprint.ToString());
byte[] key=new byte[128];
byte[] iv=new byte[128];
for(int i=0;i<message.Extension.Length;i++)
{
if(i<128)
key[i]=message.Extension[i];
else
iv[i - 128]=message.Extension[i];
}
//还原对称加密密钥
key=RSADecrypt(key, x509);
iv=RSADecrypt(iv, x509);
//解密消息
RC2CryptoServiceProvider rc2=new RC2CryptoServiceProvider();
rc2.Key=key;
rc2.IV=iv;
byte[] body=message.Body as byte[];
string bodystring=Decrypt(body, rc2);
Console.WriteLine("receive message " + bodystring);
}
实施步骤
消息接收方步骤
消息接收方申请x509证书
导出公钥给消息发送发送放
消息发送方步骤
消息发送方随机生成对称加密的密钥,使用该密钥进行对消息对称加密。
使用消息发送提供的证书对对称密钥进行非对成加密。
发送加密消息
接收方收到消息
读取消息中的证书信息
读取消息中的加密的密钥信息
使用申请的x509证书对加密密钥进行解密得到密钥
使用对称密钥对加密消息进行解密得到明文
结束
以上所分享的是关于实现MSMQ消息加密的安全实践,下面是编辑为你推荐的有价值的用户互动:
相关问题:加密认证技术在网络安全中的应用
答:信息加密是网络安全的有效策略之一。一个加密的网络,不但可以防止非授权用户的搭线窃听和入网,而且也是对付恶意软件的有效方法之一。 信息加密的目的是保护计算机网络内的数据、文件,以及用户自身的敏感信息。网络加密常用的方法有链路加密、... >>详细
相关问题:如何使用云计算加密确保数据安全性?
答:自从人类文明刚刚出现,加密技术就已经出现。在基于计算机的复杂加密方法,也就是我们现在最常用加密技术问世之前,人们就总是希望保护敏感信息以防外人的窥探。古希腊人通过在送信使者光头上纹身来保护他们的秘密信息。当信使到达目的地时,他... >>详细
相关问题:微信服务号 消息加密解密功能谁实现了 求指教
答:在公众平台开发者文档中,微信官方有提供加密解密的SDK,直接拿来使用即可。 >>详细
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
