我有一个关于RijndaelManaged和 ServicePointManager的安全问题。
我已经实现了一个系统,其中 C# 应用程序正在加密数据,例如用户凭据和一些 XML 数据。然后我使用 WebClient 将加密的用户凭据和一些包含指令的加密 XML 文档一起发送到我的 Tomcat Java Web 应用程序。Java 应用程序的工作:解密用户凭证和 XML 指令——执行指令并用加密的 XML 结果响应 C#。
从我的 C# 应用程序到 Tomcat 服务器的所有连接都启用了 SSL(目前为自签名证书)。
第一个问题: 鉴于我的 C# 应用程序默认情况下总是连接到我的服务器(仅)启用 SSL。我可以简单地将回调函数实现为:
ServicePointManager.ServerCertificateValidationCallback = 委托 { 返回真;};
据我了解,回调函数用于识别和验证我正在连接的服务器使用的证书。如果我将该应用程序提供给——比如我的一个客户连接到我的服务器(启用 SSL)——上面的代码是否令人满意?如果客户端使用我的应用程序连接到另一个未知的服务器并且我不知道它的 SSL 证书状态 - 上面的代码应该替换为实际的证书验证函数。我的问题有意义吗?
第二个问题: 我在我的 C# 应用程序中使用 RijndaelManaged 实现了加密/解密。但我使用的密钥是 C# 应用程序的一部分——应用程序被混淆了。据我了解,这不是一种安全的方式。
C# 应用程序是否有可靠的方法从我的 Web 应用程序接收加密/解密密钥。或者有没有办法在 C# 应用程序中生成密钥,Web 应用程序可以使用它来解密数据 - 如果是这样:我如何生成该密钥,最重要的是如何以可靠的安全方式将其发送到服务器方法。由于连接是 SSL - 密钥可以只是加密流的一部分吗?
这是我在 C# 应用程序中用于加密的代码。
private const string KEY = "samplekey";
private const int KEY_SIZE = 128;
private const int KEY_BITS = 16;
private string Encrypt(string textToEncrypt)
{
RijndaelManaged rijndaelCipher = new RijndaelManaged();
rijndaelCipher.Mode = CipherMode.CBC;
rijndaelCipher.Padding = PaddingMode.PKCS7;
rijndaelCipher.KeySize = KEY_SIZE;
rijndaelCipher.BlockSize = KEY_SIZE;
byte[] pwdBytes = Encoding.UTF8.GetBytes(KEY);
byte[] keyBytes = new byte[KEY_BITS];
int len = pwdBytes.Length;
if (len > keyBytes.Length)
{
len = keyBytes.Length;
}
Array.Copy(pwdBytes, 0, keyBytes, 0, len);
rijndaelCipher.Key = keyBytes;
rijndaelCipher.IV = keyBytes;
ICryptoTransform transform = rijndaelCipher.CreateEncryptor();
byte[] plainText = Encoding.UTF8.GetBytes(textToEncrypt);
return System.Convert.ToBase64String(transform.TransformFinalBlock(plainText, 0, plainText.Length));
}