2016-03-24 2 views
1

私はユーザーの個人情報を暗号化された暗号テキストとして保存することができますが、暗号化/オブジェクト。Get/Setのオブジェクトプロパティを暗号化/復号化するためのデザインパターン

たとえば、私はPatientオブジェクトがあり、オブジェクトのプロパティは社会保障番号(SSN)などの個人情報です。私は暗号化された値としてデータベースにこれを保存したいまだ、このような...

// Getting the unencrypted SSN 
var currentSSN = selectedPatient.SSN; 

// Setting the unencrypted SSN, but will be encrypted in Setter 
selectedPatient.SSN = "555-55-5555"; 

ような構文を使用してSSNを設定/アプリケーションコードを取得できるように、私は、次のようなゲッターとセッターに暗号化/復号化を配置しようとしました...

public string SSN 
{ 
    get 
    { 
    return MyEncryptionClass.Decrypt(this.SSN); 
    } 
    set 
    { 
    value = MyEncryptionClass.Encrypt(value); 
    } 
} 

注:キーと初期化ベクトルを想定するが、両方の暗号化/復号化の方法によって処理されます。私はGet/Set部分に集中したいと思っていました。

問題は、SetterにEncryptメソッドがあるにもかかわらず、SSNがデータベースレコードにプレーンテキストとして格納されていることです。私は、暗号化ルーチンが実際に適切な暗号テキストを返すことをデバッグすることで確認することができますが、データベースレコードには格納されていないようです。私の考えは、Get/Setはやや円形です。その値を設定することで、私はdecryptメソッドを呼び出して、レコードに格納されているものが実際に復号化されるようにしています。

この暗号化/復号化をオブジェクトのコンシューマにシームレスにすることができるように、人々が見つけたパターンがありますか?私は手動で暗号化/復号化メソッドを呼び出さなくてもいいようにしたい。

EDIT - 私は、次の可能性がEntity FrameworkのV6

+0

データアクセスコードは、オブジェクトのちょうど別のクライアントです。データアクセスコードがSSNプロパティの値を読み取ってデータベースに格納しようとすると、他のクライアントと同じように暗号化されていない値が取得されます。 –

+1

データアクセスの仕組みを教えてください。具体的には、オブジェクトのデータをデータベースにどのように格納しますか?エンティティフレームワークを使用していますか? –

+0

意味があります。どのようにより良いパターンを設計するための任意の提案?私はデータアクセスのためにEntity Framework 6 Code Firstを使用します。 – webworm

答えて

2

単純なパターンを使用しています:

// this property will be persisted in the database, but can't be modified from outside 
public string SSN { get; private set; } 

// the attribute will make sure this doesn't get mapped to the db 
// this property uses the other property as a backing field with proper conversions 
[NotMapped] 
public string SSNDecrypted 
{ 
    get 
    { 
    return MyEncryptionClass.Decrypt(this.SSN); 
    } 
    set 
    { 
    this.SSN = MyEncryptionClass.Encrypt(value); 
    } 
} 
+0

これはまさに私が探していたものでした!ありがとう! – webworm