【发布时间】:2011-05-23 10:53:16
【问题描述】:
我们正在尝试在我们的 XP SP2 机器(Win7 之后)上为我们的 C# (.net 3.5) 应用程序执行此操作。
在我们的安装程序(由 VS2008 创建)中,我们使用 AES 密钥和 iv 加密我们的连接字符串,然后创建一个 RSA key-pair 并将它们存储在 MachineKeyStore 中。安装程序将使用RSA public key 对AES 密钥和iv 进行加密,并将加密后的密钥和iv 与加密的连接字符串一起存储。
安装后,我们的应用程序会用加密的AES密钥和iv读回加密的连接字符串,并使用RSA private key(来自MachineKeyStore)解密AES密钥和iv然后解密连接字符串使用AES 键和iv。
安装程序和我们的应用程序为MachineKeyStore 的container name 共享一个constant string。
我知道密钥对的存储位置,因此我可以监控它以查看密钥对是否被删除、更新或创建。
我做了一些测试,发现了一些有趣的东西(出乎意料),但不知道为什么会这样。我的用户帐户是管理员帐户。
- 安装程序可以删除我们的应用程序创建的存储的
key-pair,并立即创建一个具有相同容器名称的新的; - 安装程序可以更新我们的应用程序创建的
key-pair(不是删除并重新创建,我认为它是覆盖 - 但根据文档不应该发生这种情况) - 我们的应用程序无法删除安装程序创建的密钥对:当密钥对实际存在时,
CryptographicException: Keyset does not exist.会发生异常; - 当安装程序创建的密钥对存在时,我们的应用程序无法创建新的:
CryptographicException: Keyset does not exist. - 我们的应用程序无法访问安装程序创建的密钥对,
CryptographicException: Access is denied.在这种情况下会发生。安装程序中的加密适用于AES和RSA public key。当应用尝试使用存储的private key进行解密时,会出现“Access is denied”异常。
我们的代码如下:
public static void CreateRSAKeyPair(string keyContainerName)
{
DeleteRSAKeyPair(keyContainerName);
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = keyContainerName;
cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams))
{
rsa.PersistKeyInCsp = false;
}
}
public static void DeleteRSAKeyPair(string keyContainerName)
{
CspParameters cspParams = new CspParameters();
cspParams.KeyContainerName = keyContainerName;
cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;
using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cspParams))
{
rsa.PersistKeyInCsp = false;
try
{
rsa.Clear();
}
catch (CryptographicException ex)
{
Log.logItem(LogType.Exception, "RSA key clear error, can be ignored", "SecurityMgr::DeleteRSAKeyPair()", "CryptographicException msg=" + ex.ToString());
}
}
}
访问private key进行解密的代码:
private static byte[] RSADecrypt(byte[] inputData, string keyContainerName)
{
byte[] resultData = null;
try
{
CspParameters cspParams = new CspParameters();
cspParams.Flags |= CspProviderFlags.UseMachineKeyStore;
cspParams.KeyContainerName = keyContainerName;
using (RSACryptoServiceProvider rsaProvider = new RSACryptoServiceProvider(cspParams))
{
//rsaProvider.PersistKeyInCsp = true;
//private key
RSAParameters rsaParams = rsaProvider.ExportParameters(true);
rsaProvider.ImportParameters(rsaParams);
resultData = rsaProvider.Decrypt(inputData, false);
}
}
catch (CryptographicException ex)
{
string msg = "CryptographicException: keyContainerName=" + keyContainerName + "\nmsg=" + ex.ToString();
Log.logItem(LogType.Exception, "RSA decryption exception", "SecurityMgr::RSADecrypt()", msg);
}
return resultData;
}
RSA非对称加密可以这样用吗?
编辑:
对我们应用程序中的连接字符串(不涉及安装程序)执行相同的操作(使用 AES 和 RSA 加密)可以正常工作。
【问题讨论】:
标签: c# .net security encryption installation