2012-06-13 3 views
0

У меня есть класс с кучей полей, которые необходимо зашифровать перед сохранением, что-то вроде этого;C# строковое шифрование производительности

class MyClass 
{ 
    public string CustomerName{ get; set; } 
    public string Address1{ get; set; } 
    public string Address2{ get; set; } 
    public string Town{ get; set; } 
    public string Postcode{ get; set; } 

    // updated 
    public DateTime RegistrationDate { get; set; } // don't encrypt 
} 

Каков наиболее эффективный подход к шифрованию полей в этом объекте? Как насчет того, нужно ли зашифровать 100 или 1000 таких объектов? (Мы можем использовать TPL?)

UPDATE:
Некоторые из полей может не потребоваться шифрование, так что я не хочу, чтобы зашифровать весь класс.
. NET4 приемлемо.

+1

Как «зашифрованы» они должны быть? Если вы используете SQL-сервер, считаете ли вы шифрование на уровне базы данных? – Paddy

+2

Взгляните на [SecureString] (http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx) (.NET 2.0+), когда он находится в памяти - на самом деле не помогает вы с сохранением, но это все еще полезно. – Bridge

+0

http://stackoverflow.com/questions/202011/encrypt-decrypt-string-in-net –

ответ

0

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

RijndaelManaged csp = new RijndaelManaged() { Mode = CipherMode.CBC, Padding = PaddingMode.ISO10126 }; 
    // TODO: define Key and IV 
    Stopwatch encryptionTime = Stopwatch.StartNew(); 
    Parallel.For(0, 1000, i => 
     { 
      string fieldValue = "abcdef..."; 
      byte[] fieldBytes = UTF8Encoding.UTF8.GetBytes(fieldValue); 
      byte[] fieldEncrypred; 
      using (var ms = new MemoryStream()) 
      using (var cs = new CryptoStream(ms, csp.CreateEncryptor(), CryptoStreamMode.Write)) 
      { 
       cs.Write(fieldBytes, 0, fieldBytes.Length); 
       cs.FlushFinalBlock(); 
       fieldEncrypred = ms.ToArray(); 
      } 
     }); 
    encryptionTime.Stop(); 
    Console.WriteLine(encryptionTime.Elapsed.TotalMilliseconds); 

Вы можете изменить выше, чтобы покрыть ваши потребности и выполнять свои собственные тесты.

Для приведенного выше примера вы будете нуждаться:

using System; 
using System.Diagnostics; 
using System.IO; 
using System.Security.Cryptography; 
using System.Text; 
using System.Threading.Tasks; 
+0

Если OP использует .NET 4.0, то есть. – Bridge

+0

Да, .NET 4 в порядке. Оригинальный пост обновлен. –

0

Во-первых, сериализовать весь объект (например, с помощью Protobuf сети), а затем зашифровать сериализованные байт с помощью CryptoStream.

Если результирующие байты, как правило, небольшие (например, менее 256 КБ), вы можете сохранить их в поле varbinary (MAX) в базе данных sql. Если они, как правило, больше, вам лучше хранить их в виде файлов в файловой системе.

+0

Спасибо, что нашли время, чтобы дать ответ. Я хотел бы делать поля отдельно, а не весь объект. Могут быть некоторые поля, которые не нужно зашифровывать. Вопрос отредактирован соответствующим образом. –

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