Безопасность с помощью 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));
}

0 ответов

Другие вопросы по тегам