0

我有一个类,其中包含一堆需要在保存之前加密的字段,就像这样;

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 吗?)

更新
有些字段可能不需要加密,所以我不想加密整个班级。
.NET4 是可以接受的。

4

2 回答 2

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;
于 2012-06-13T10:27:48.477 回答
0

首先,序列化整个对象(例如使用 protobuf-net),然后使用CryptoStream加密序列化的字节。

如果生成的字节通常很小(例如小于 256KB),您可以将它们存储在 sql 数据库中的 varbinary(MAX) 字段中。如果它们通常较大,则最好将它们作为文件存储在文件系统中。

于 2012-06-13T10:28:37.533 回答