шифрование - машинный ключ

Я пытаюсь найти безопасный способ шифрования нескольких полей в моей базе данных с помощью С# для моего веб-приложения.

Мне нужно найти скрипт, который выполняет шифрование/дешифрование и способ хранения ключа. Я читал, что вы можете использовать машинный ключ в качестве ключа, это правильно?

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

http://aspnetresources.com/tools/machineKey

Какой сценарий шифрования/дешифрования будет работать с этим машинным ключом?

Также мне было интересно, насколько безопасно хранить не сгенерированный автоматически ключ машины в файле web.config? Если кто-то может видеть файл web.config, зачем использовать ключ машины вместо «обычного» ключа, например, в appSettings?

Спасибо


person user441365    schedule 09.12.2011    source источник


Ответы (1)


Согласно этой статье, генерируются 256-битный ключ дешифрования и 512-битный ключ проверки, и они соответствуют алгоритму Rijndael, поэтому вам нужна его реализация на C#, которая уже находится в пространстве имен System.Security.Cryptography.

Вот две функции, которые выполняют эту работу:

private static string EncryptString(string clearText, 
                                    string strKey, string strIv) {

    byte[] plainText = Encoding.UTF8.GetBytes(clearText);

    byte[] key = Encoding.UTF8.GetBytes(strKey);

    // a simple initialization vector
    byte[] iv = Encoding.UTF8.GetBytes(strIv);


    RijndaelManaged rijndael = new RijndaelManaged();

    //Define the Mode
    rijndael.Mode = CipherMode.CBC;

    ICryptoTransform aesEncryptor = rijndael.CreateEncryptor(key, iv);

    MemoryStream ms = new MemoryStream();

    // writing data to MemoryStream
    CryptoStream cs = new CryptoStream(ms, aesEncryptor, CryptoStreamMode.Write);
    cs.Write(plainText, 0, plainText.Length);
    cs.FlushFinalBlock();

    byte[] CipherBytes = ms.ToArray();

    ms.Close();
    cs.Close();

    return Convert.ToBase64String(CipherBytes);
}

И :

public static string DecryptString(string cipherText, 
                                   string strKey, string strIv) {

          byte[] cipheredData = Convert.FromBase64String(cipherText);
          byte[] key = Encoding.UTF8.GetBytes(strKey);

          byte[] iv = Encoding.UTF8.GetBytes(strIv);

          RijndaelManaged rijndael = new RijndaelManaged();
          rijndael.Mode = CipherMode.CBC;

          ICryptoTransform decryptor = rijndael.CreateDecryptor(key, iv);
          MemoryStream ms = new MemoryStream(cipheredData);
          CryptoStream cs = new CryptoStream(ms, decryptor, CryptoStreamMode.Read);

          byte[] plainTextData = new byte[cipheredData.Length];

          int decryptedByteCount = cs.Read(plainTextData, 0, plainTextData.Length);

          ms.Close();
          cs.Close();

          return Encoding.UTF8.GetString(plainTextData, 0, decryptedByteCount);
}

А что касается вашего второго вопроса, сгенерированный ключ машины представляет собой шестнадцатеричную строку, которую может прочитать человек, но вы не можете ее понять.

Я надеюсь, что это поможет.

person amrfaissal    schedule 09.12.2011
comment
где они совпадают с машинным ключом? строка strKey, строка strIv - person user441365; 09.12.2011
comment
strKey — это ваш машинный ключ. strIv, что означает строку вектора инициализации, представляет собой простую строку, в которую вы можете передать любое значение. - person amrfaissal; 09.12.2011
comment
могу ли я жестко запрограммировать strIv тогда? кроме того, strKEy должен совпадать с validationKey или decryptionKey? - person user441365; 09.12.2011
comment
decryptionKey используется для шифрования и расшифровки данных. Эта ссылка объясняет вещи намного лучше: msdn.microsoft.com/en-us/library /ff649308.aspx - person amrfaissal; 09.12.2011