как исправить CspParameters, не поддерживаемые исключением Mono, вызывающим CryptDeriveKey - PullRequest
1 голос
/ 10 декабря 2011

Я пытаюсь перенести код восстановления пароля ASP .NET MVC2 из Где найти пример кода C # для реализации восстановления пароля в ASP .NET MVC2 ответ на Mono.Процедура ниже.Вызов CryptDeriveKey вызывает исключение в Mono

CspParameters not supported by Mono

Как реализовать восстановление пароля в Mono в приложении ASP .NET MVC2?

    /// <summary> 
    /// Takes a text message and encrypts it using a password as a key. 
    /// </summary> 
    /// <param name="plainMessage">A text to encrypt.</param> 
    /// <param name="password">The password to encrypt the message with.</param> 
    /// <returns>Encrypted string.</returns> 
    /// <remarks>This method uses TripleDES symmmectric encryption.</remarks> 
    public static string EncodeMessageWithPassword(string plainMessage, string password)
    {
        if (plainMessage == null)
            throw new ArgumentNullException("encryptedMessage", "The message cannot be null");

        TripleDESCryptoServiceProvider des = new TripleDESCryptoServiceProvider();
        des.IV = new byte[8];

        //Creates the key based on the password and stores it in a byte array. 
        PasswordDeriveBytes pdb = new PasswordDeriveBytes(password, new byte[0]);
        // in mono CryptDeriveKey causes exception:
        // CspParameters not supported by Mono
        des.Key = pdb.CryptDeriveKey("RC2", "MD5", 128, new byte[8]);

        MemoryStream ms = new MemoryStream(plainMessage.Length * 2);
        CryptoStream encStream = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
        byte[] plainBytes = Encoding.UTF8.GetBytes(plainMessage);
        encStream.Write(plainBytes, 0, plainBytes.Length);
        encStream.FlushFinalBlock();
        byte[] encryptedBytes = new byte[ms.Length];
        ms.Position = 0;
        ms.Read(encryptedBytes, 0, (int)ms.Length);
        encStream.Close();

        return Convert.ToBase64String(encryptedBytes);
    }

1 Ответ

3 голосов
/ 10 декабря 2011

Вы не можете исправить , так как тип CspParameters на самом деле не , поддерживаемый Mono.

Причина в том, что этот тип используется для передачи дополнительной информации между (управляемым) кодом BCL и CSP CryptoAPI (поставщиком услуг шифрования).Поскольку Mono использует только управляемый код, а CryptoAPI недоступен за пределами Windows, класс CspParameters в основном является заглушкой, определение без кода.

В частности, тип PasswordDeriveBytesнемного особенным.Он реализует стандарт PKCS # 5 v1.5, который поддерживает Mono, но также добавляет несколько расширений Microsoft (нарушая спецификацию), в том числе одно из них полностью сломано (по соображениям безопасности).При использовании PasswordDeriveBytes.

вы должны быть очень осторожны. Корпус для CryptDeriveKey еще более плохо продуман.Это не имеет ничего общего с (любой версией) PKCS # 5, как и остальная часть PasswordDeriveBytes (т.е. это не основано на стандартах).Он просто перенаправляет ваши параметры в CryptoAPI, используя CSP по умолчанию.Некоторые основные проблемы возникают из-за этого:

  1. AFAIK Microsoft никогда не публиковала алгоритмы, которые они используют для получения ключей в их CSP.Я не могу сказать, если это даже безопасно, их расширения PKCS # 5 не были;

  2. CSP «по умолчанию» может быть изменен (например, приложениями) на значение по умолчанию не-MicrosoftCSP (например, CSP Hardward / Smartcard).Алгоритм извлечения ключей, предоставляемый этими CSP, неизвестен (надеюсь, они перезванивают в MS CSP);

  3. CryptoAPI и CSP доступны только в Windows и отличаются версией Windows / экспортируемость, а не версия .NET Framework.

Вам следует избегать использования PasswordDeriveBytes.CryptDeriveKey даже в Windows, если вы не можете гарантировать, что CSP по умолчанию (и останется) одинаковым для всехкомпьютеры, на которых работает ваше приложение.

В заключение, во избежание проблем совместимости / безопасности, я настоятельно рекомендую вам использовать более новую версию PKCS # 5 v2, которую Mono / MonoTouch / Microsoft использует как System.Security.Cryptography.Rfc2898DeriveBytes.

...