Безопасность с помощью RijndaelManaged и ServicePointManager
У меня есть секретный вопрос о RijndaelManaged иServicePointManager.
Я реализовал систему, в которой приложение C# шифрует данные, такие как учетные данные пользователя и некоторые данные XML. Затем я использую WebClient для отправки зашифрованных учетных данных пользователя с некоторым зашифрованным XML-документом, содержащим инструкции, - в мое веб-приложение Tomcat Java. Работа приложения Java: расшифровывать учетные данные пользователя и инструкции XML - выполнять инструкции и отвечать на C# с зашифрованным результатом XML.
Все подключения моего приложения C# к серверу Tomcat с включенным SSL (пока самоподписанный сертификат).
Первый вопрос: учитывая тот факт, что мое приложение C# по умолчанию всегда подключается к моему Серверу (только) с включенным SSL. Могу ли я просто реализовать функцию обратного вызова как:
ServicePointManager.ServerCertificateValidationCallback = делегат {возвращать истину; };
Как я понимаю, функция обратного вызова используется для идентификации и проверки сертификата, используемого сервером, к которому я подключаюсь. Если бы мне нужно было передать это приложение - скажем, одному из моих клиентов для подключения к моему Серверу (с включенным SSL) - удовлетворительный ли код выше? Если клиент использует мое приложение для подключения к другому неизвестному серверу, и у меня нет идеи о его статусе SSL-сертификата - приведенный выше код должен быть заменен действительной функцией проверки сертификата. Имеет ли смысл мой вопрос?
Второй вопрос: в моем приложении C# реализовано шифрование / дешифрование с использованием RijndaelManaged. Но ключ, который я использую, является частью приложения C# - приложение запутано. Насколько я понимаю, это не безопасный способ.
Существует ли надежный способ для приложения C# получить ключ шифрования / дешифрования из моего веб-приложения. Или есть способ генерирования ключа в приложении C#, который может быть использован веб-приложением для расшифровки данных - если это так: как сгенерировать этот ключ и, что наиболее важно, как отправить его на сервер в надежном безопасном путь. Поскольку соединение является 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));
}