C #, как проверить, если значение зашифровано с использованием парольной фразы MD5? - PullRequest
5 голосов
/ 26 ноября 2009

У меня есть следующий код для шифрования значения (перечислены ниже). Теперь я хотел бы написать метод boEl isEncrypted (). Существует ли надежный и надежный способ проверить, было ли зашифровано значение с помощью этой функции. У меня есть процедура расшифровки и я могу контролировать фразу-пароль, но не уверен, поможет ли это.

Причина в том, что при первом запуске приложения значения в файле конфигурации не шифруются, в этом случае приложение должно автоматически зашифровать эти значения. При втором запуске я не хочу снова шифровать, потому что, очевидно, это может привести к хаосу. Наконец, я не хочу добавлять атрибут isEncrypted к значению конфигурации. Я хочу, чтобы он работал и выглядел максимально динамично.

Пока что я склоняюсь к использованию len (128) в качестве решающего фактора, но всегда есть маловероятный шанс того, что незашифрованное значение также будет этой длиной.

Заранее спасибо.

public static string encrypt(string text)
    {
        // Locals
        var passphrase = "5ab394ed-3920-4932-8d70-9c1b08f4ba4e";
        byte[] results;
        var utf8 = new UTF8Encoding();

        // Step 1. We hash the passphrase using MD5
        // We use the MD5 hash generator as the result is a 128 bit byte array
        // which is a valid length for the TripleDES encoder we use below
        var hashProvider = new MD5CryptoServiceProvider();
        var tdesKey = hashProvider.ComputeHash(utf8.GetBytes(passphrase));

        // Step 2. Create a new TripleDESCryptoServiceProvider object
        // Step 3. Setup the encoder
        var tdesAlgorithm = new TripleDESCryptoServiceProvider
        {
            Key = tdesKey,
            Mode = CipherMode.ECB,
            Padding = PaddingMode.PKCS7
        };

        // Step 4. Convert the input string to a byte[]
        var dataToEncrypt = utf8.GetBytes(text);

        // Step 5. Attempt to encrypt the string
        try
        {
            var encryptor = tdesAlgorithm.CreateEncryptor();
            results = encryptor.TransformFinalBlock(dataToEncrypt, 0, dataToEncrypt.Length);
        }
        finally
        {
            // Clear the TripleDes and Hashprovider services of any sensitive information
            tdesAlgorithm.Clear();
            hashProvider.Clear();
        }

        // Step 6. Return the encrypted string as a base64 encoded string
        return Convert.ToBase64String(results);
    }

Ответы [ 3 ]

4 голосов
/ 26 ноября 2009

Во-первых, серьезной проблемой является крайне плохая идея использовать криптографические примитивы самостоятельно. Вы выбрали режим шифрования «Электронная кодовая книга», который обладает тем свойством, что идентичные блоки открытого текста создают идентичные блоки шифрованного текста. Посмотрите пример в Википедии .

Тем не менее, простое решение заключается в добавлении токена, такого как 'ENC:', к зашифрованному паролю. Если вам нужно беспокоиться о злонамеренном вмешательстве в файл конфигурации, вам следует перейти к использованию кода аутентификации сообщения, такого как HMAC.

4 голосов
/ 26 ноября 2009

Что вы можете сделать в методе isEncrypted, это попытаться расшифровать сообщение.
Поскольку вы используете заполнение PKCS7, скорее всего, незашифрованное сообщение не сможет расшифровать, поскольку заполнение не соответствует установленному режиму заполнения.

Расшифровка вызовет исключение, и вам придется перехватить это и вернуть false в этом случае.

Существует небольшая вероятность того, что расшифровка будет выполнена (если сообщение не зашифровано), если данные соответствуют режиму заполнения. Это, однако, очень маловероятно.

В этом случае я хотел бы добавить какой-либо флаг к зашифрованным данным или добавить некоторые данные к зашифрованному сообщению, поскольку затем я могу удалить его при расшифровке. Это был бы самый надежный способ.

2 голосов
/ 26 ноября 2009

Поскольку ваша функция возвращает строку, нет причины, по которой вы не можете добавить код открытого текста в начало зашифрованных данных, которые может искать функция IsEncrypted, скажем, «MD5ENC» + [ciphertext].

Недостатком этого является то, что он позволит любому, у кого есть необработанная строка, знать, какой алгоритм использовался для шифрования. Но так как мы постоянно напоминаем о безопасности через неизвестность, это вовсе не безопасность. Любой должен знать, что как что-то было зашифровано, и у него нет простого способа сломать это шифрование.

Обратите внимание на мое использование слова следует .

Во всяком случае, чтобы вернуться к моему первоначальному предложению. Преимущество этого состоит в том, что чем длиннее ваш вводный код в строке, тем мельчайшие шансы на то, что он будет случайно сгенерирован в другой несвязанной зашифрованной строке Base64.

Если зашифрованный текст нужно расшифровать, просто отрежьте свой код идентификации стандартной длины для шифрования, и все - иди ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...