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 を活用できますか?)

UPDATE :
一部のフィールドは暗号化を必要としない可能性があるため、クラス全体を暗号化したくありません。
.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 に答える