2015-08-16 2 views
0

я создал два метода в C#:My SQL функция CLR сервера очень медленно

public static string Encrypt(string clearText, string encryptionKey) 
{ 
     byte[] clearBytes = Encoding.Unicode.GetBytes(clearText); 

     using (Aes encryptor = Aes.Create()) 
     { 
      var pdb = new Rfc2898DeriveBytes(encryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
      encryptor.Key = pdb.GetBytes(32); 
      encryptor.IV = pdb.GetBytes(16); 

      using (var ms = new MemoryStream()) 
      { 
       using (var cs = new CryptoStream(ms, encryptor.CreateEncryptor(), CryptoStreamMode.Write)) 
       { 
        cs.Write(clearBytes, 0, clearBytes.Length); 
        cs.Close(); 
       } 

       clearText = Convert.ToBase64String(ms.ToArray()); 
      } 
     } 

     return clearText; 
    } 

    public static string Decrypt(string cipherText, string encryptionKey) 
    { 
     try 
     { 
      byte[] cipherBytes = Convert.FromBase64String(cipherText); 

      using (Aes encryptor = Aes.Create()) 
      { 
       var pdb = new Rfc2898DeriveBytes(encryptionKey, new byte[] { 0x49, 0x76, 0x61, 0x6e, 0x20, 0x4d, 0x65, 0x64, 0x76, 0x65, 0x64, 0x65, 0x76 }); 
       encryptor.Key = pdb.GetBytes(32); 
       encryptor.IV = pdb.GetBytes(16); 

       using (var ms = new MemoryStream()) 
       { 
        using (var cs = new CryptoStream(ms, encryptor.CreateDecryptor(), CryptoStreamMode.Write)) 
        { 
         cs.Write(cipherBytes, 0, cipherBytes.Length); 
         cs.Close(); 
        } 

        cipherText = Encoding.Unicode.GetString(ms.ToArray()); 
       } 
      } 
     } 
     catch (Exception) 
     { 
     } 

     return cipherText; 
    } 

Следуя инструкции, приведенные в This Link, я создал функцию CLR в SQL Server, и я пытаюсь вызвать его как:

SELECT dbo.Decrypt(MyEncrypted, EncryptionKey) 
FROM MyTable 

проблема в том, что оно принимает слишком много времени. Как всего за 1000 строк, потребовалось 1,5 минуты. Если я вызываю свой запрос без функции CLR, это заняло менее 1 секунды.

Есть ли что-нибудь, что я могу сделать для повышения производительности функций CLR?

+0

Вы можете использовать шифрование сервера sql? почему вы сохраняете его как строку, когда можете сохранить необработанные байты? –

+0

Будет ли это улучшать производительность? –

+0

возможно. вам придется протестировать его. –

ответ

1

Я проанализировал свой Decrypt метод с анализатором производительности в VS2010, запустив его в 100 раз:

hottest path is GetBytes

Как вы можете видеть GetBytes метод экземпляра Rfc2898DeriveBytes занять большую часть времени.

Я не знаю, почему у вас есть эти специфические требования шифрования/дешифрования, но один из способов повлиять на время метод GetBytes принимает это экземпляр Rfc2898DeriveBytes с помощью constructor, который принимает итерации в качестве третьего параметра. По умолчанию это на 1000, я могу установить его как низко как 1. НО ЭТО НАСТОЯТЕЛЬНО РЕКОМЕНДУЕТСЯ ПРОТИВ

var pdb = new Rfc2898DeriveBytes(encryptionKey, salt, 10); 

Это Итерации действительно необходимо быть одинаковым для обоих Encrypt и Decrypt, так что вы должны будете Расшифруйте \ Шифруйте текущие значения, если вы хотите изменить это.

Другим вариантом может быть кэширование значений IV, как представляется, рекомендуется в this answer. Мне не хватает эксперта, если они говорят о том, что используют тот же ключ, но если это опция, вы можете кэшировать вызов на GetBytes для ключа.

Все описанные изменения влияют на то, как ваши данные зашифрованы, и сила вашего шифрования. Рассмотрите оба воздействия при тестировании решений.

+0

Сокращение числа итераций на функциях деривации ключей имеет криптографические последствия. Не рекомендуйте его для получения перфорации. –

+0

OK отмечено. и часть кэширования, сохраните IV в таблице и прочитайте KEY из конфигурационного файла/реестра @RemusRusanu, чтобы вам не нужны вызовы GetBytes при расшифровке? – rene

+0

... или использовать встроенный SQL Server ['ENCRYPTBYPASSPHRASE'] (https://msdn.microsoft.com/en-us/library/ms190357.aspx) –

Смежные вопросы