C # 4.0 / Sql Server 2008: шифрование / дешифрование на бизнес-уровне - PullRequest
2 голосов
/ 12 марта 2012

Мне просто нужен совет.Мне нужно защитить некоторые данные столбцов, поэтому я прибегаю к поиску шифрования в C # 4.0 / Sql server 2008 (не R2).

Это, вероятно, то, что мне нужно:

"Когда данные должны быть защищены от системных администраторов. Практически в этом сценарии было бы лучше не использовать внутреннее шифрование SQL Server, а гораздо лучше полагаться исключительно на средний уровень для выполнения шифрования и дешифрования.очень трудно защитить ваши данные от определенного системного администратора, если ваши ключи хранятся в SQL Server. "Источник: msdn

Какой правильный подход?

Я пытался сохранить данные, которые были зашифрованы с помощью Rijndael , в базу данных.

Я получаю ошибку: Length of the data to decrypt is invalid

Я еще не погуглил.

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

Есть предложения?

Спасибо

РЕДАКТИРОВАТЬ:

Хорошо, это то, что я имею до сих пор.Данные зашифрованы с помощью Rinjdael, как показано ранее.Он хранится в столбце

TestCrypt (varbinary(255), null)

В базе данных он выглядит следующим образом:

0xF6CA99F5B6BFA1D9A0BD2381177E049E02F381078966195B68A54A5BEC4C

Получается с помощью sp, например:

SELECT cast(s.TestCrypt AS varbinary) AS TestCrypt

А в слое доступа к данным:

while (reader.Read())
{
    data.TestCrypt = (byte[])reader["TestCrypt"];
}

В этой строке обнаружена ошибка в DecryptStringFromBytes

plaintext = srDecrypt.ReadToEnd();

Ошибка: длина данных для расшифровки недопустима.

Ответы [ 4 ]

0 голосов
/ 13 марта 2012
SELECT cast(s.TestCrypt AS varbinary) AS TestCrypt

Эта строка усекает значение от TestCrypt до 30 байтов :

Если n не указано в определении определения данных или оператора объявления переменной, по умолчаниюдлина равна 1. Если функция CAST не указана, длина по умолчанию равна 30.

Попробуйте:

SELECT cast(s.TestCrypt AS varbinary(255)) AS TestCrypt
0 голосов
/ 12 марта 2012

Что касается шифрования и дешифрования на бизнес-уровне, я предпочитаю использовать следующий метод шифрования и дешифрования:

#region Encryption Decription
public class CryptorEngine
{
/// <summary>
/// Encrypt a string using dual encryption method. Return a encrypted cipher Text
/// </summary>
/// <param name="toEncrypt">string to be encrypted</param>
/// <param name="useHashing">use hashing? send to for extra security</param>
/// <returns></returns>
public static string Encrypt(string toEncrypt, bool useHashing)
{
    try
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);

        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
        // Get the key from config file
        string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));
        //System.Windows.Forms.MessageBox.Show(key);
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        tdes.Clear();
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }
    catch (Exception ex)
    {
        return "Invalid";   
    }
}
/// <summary>
/// DeCrypt a string using dual encryption method. Return a DeCrypted clear string
/// </summary>
/// <param name="cipherString">encrypted string</param>
/// <param name="useHashing">Did you use hashing to encrypt this data? pass true is yes</param>
/// <returns></returns>
public static string Decrypt(string cipherString, bool useHashing)
{
    try
    {
        if (string.IsNullOrEmpty(cipherString))
            return "";
        byte[] keyArray;
        byte[] toEncryptArray = Convert.FromBase64String(cipherString);

        System.Configuration.AppSettingsReader settingsReader = new AppSettingsReader();
        //Get your key from config file to open the lock!
        string key = (string)settingsReader.GetValue("SecurityKey", typeof(String));

        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        tdes.Clear();
        return UTF8Encoding.UTF8.GetString(resultArray);
    }
    catch (Exception ex)
    {
       return "Invalid";   
    }
}
}
#endregion
0 голосов
/ 12 марта 2012

Зашифруйте свои данные в .net с помощью любого поставщика услуг шифрования и сохраните их в столбце с типом данных VARBINARY правильной длины.

В остальном обрабатывать данные так же, как и все остальные данные.

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