Looking for .net Keywords? Try Ask4Keywords

.NET Framework Создайте ключ из пароля / случайного СОЛЬ (в C #)


пример

using System;
using System.Security.Cryptography;
using System.Text;

public class PasswordDerivedBytesExample
{
    public static void Main(String[] args)
    {
        // Get a password from the user.
        Console.WriteLine("Enter a password to produce a key:");

        byte[] pwd = Encoding.Unicode.GetBytes(Console.ReadLine());

        byte[] salt = CreateRandomSalt(7);

        // Create a TripleDESCryptoServiceProvider object.
        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();

        try
        {
            Console.WriteLine("Creating a key with PasswordDeriveBytes...");

            // Create a PasswordDeriveBytes object and then create
            // a TripleDES key from the password and salt.
            PasswordDeriveBytes pdb = new PasswordDeriveBytes(pwd, salt);

            // Create the key and set it to the Key property
            // of the TripleDESCryptoServiceProvider object.
            tdes.Key = pdb.CryptDeriveKey("TripleDES", "SHA1", 192, tdes.IV);

            Console.WriteLine("Operation complete.");
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            // Clear the buffers
            ClearBytes(pwd);
            ClearBytes(salt);

            // Clear the key.
            tdes.Clear();
        }

        Console.ReadLine();
    }

    #region Helper methods

    /// <summary>
    /// Generates a random salt value of the specified length.
    /// </summary>
    public static byte[] CreateRandomSalt(int length)
    {
        // Create a buffer
        byte[] randBytes;

        if (length >= 1)
        {
            randBytes = new byte[length];
        }
        else
        {
            randBytes = new byte[1];
        }

        // Create a new RNGCryptoServiceProvider.
        RNGCryptoServiceProvider rand = new RNGCryptoServiceProvider();

        // Fill the buffer with random bytes.
        rand.GetBytes(randBytes);

        // return the bytes.
        return randBytes;
    }

    /// <summary>
    /// Clear the bytes in a buffer so they can't later be read from memory.
    /// </summary>
    public static void ClearBytes(byte[] buffer)
    {
        // Check arguments.
        if (buffer == null)
        {
            throw new ArgumentNullException("buffer");
        }

        // Set each byte in the buffer to 0.
        for (int x = 0; x < buffer.Length; x++)
        {
            buffer[x] = 0;
        }
    }

    #endregion
}

Этот пример взят из MSDN.

Это демонстрация консоли, в которой показано, как создать защищенный ключ на основе пользовательского пароля и как создать произвольную ОСВ на основе криптографического генератора.

Заметки:

  • Встроенная функция PasswordDeriveBytes использует стандартный алгоритм PBKDF1 для генерации ключа из пароля. По умолчанию он использует 100 итераций для генерации ключа, чтобы замедлить атаки грубой силы. Соль, генерируемая случайным образом, еще более укрепляет ключ.

  • Функция CryptDeriveKey преобразует ключ, сгенерированный PasswordDeriveBytes в ключ, совместимый с указанным алгоритмом шифрования (здесь «TripleDES»), используя указанный хэш-алгоритм (здесь «SHA1»). Ключ в этом примере составляет 192 байта, а вектор инициализации IV берется у поставщика криптографии с тройным DES

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

  • К сожалению, CryptDeriveKey настоящее время не поддерживает AES. См. Здесь.
    ПРИМЕЧАНИЕ. В качестве обходного пути вы можете создать случайный ключ AES для шифрования данных, которые должны быть защищены AES, и сохранить ключ AES в TripleDES-контейнере, который использует ключ, сгенерированный CryptDeriveKey . Но это ограничивает безопасность TripleDES, не использует преимущества больших ключей AES и создает зависимость от TripleDES.

Использование: см. Метод Main ().