編集:更新-このプロジェクトのために、認証付きのAESを効率的に実装する方法を調査しています。時間があれば、このFOSSプロジェクトに最適な実装を見つけるためのスキルに感謝します。
Codeplexで 先ほど投稿した暗号化コード をレビューしてコメントしていただけませんか?これは、Azureテーブルのプロパティを暗号化するための基盤としてこれを使用し、権限のないMSFT従業員が自分のデータを誤って参照または編集するのを防ぐことを目的としています。これは、ローカルシステムで公開秘密鍵のペアを使用する必要がある実用的なサンプルです。秘密鍵に権限を正しく設定していることを確認してください。
Azureテーブルでは、対称キーを使用して、以下のすべてのプロパティ(行キーとパーティションキーを含む)を暗号化したいと思います。
public class ContactDataModel :TableServiceEntity
{
public ContactDataModel(string partitionKey, string rowKey)
: base(partitionKey, rowKey)
{
}
public ContactDataModel(): this(Guid.NewGuid().ToString(), String.Empty)
{
}
public string Name { get; set; }
public string Address { get; set; }
// Used to rotate keys, while allowing old data to still be read
public int EncryptionVersion {get;set;}
}
対称キーの暗号化されたバージョンと、暗号化されていないIVをAzure Tableストレージに保存するつもりです。全体的な設計では、IVが利用可能であっても、暗号化された対称キーが他のすべての暗号化されたテーブルデータを役に立たないと想定しています。
対称キーは、RSAキーで暗号化されます Azure Roleインスタンスに安全に配信されます 。
既知の問題:
対称暗号化でシードが欠落していることは知っています。これを暗号の観点からどのように実装しますか?
暗号化と暗号に関する学んだ教訓と誤解 のスレッドをご覧になることをお勧めします。私があなたのコードを正しく読んでいる場合、このコードはそこにリストされている少なくとも1つの間違いをしているようです。 (例:認証なしの暗号化の使用)そのページを注意深く確認して、そこに記載されている間違いを回避していることを確認してください。
さらに真剣に、独自の暗号化形式を設計することは良い考えではないかもしれません。ホイールを(安全に)再発明するのではなく、データの暗号化には、GPGやPGPなどの十分に吟味された既存のスキームを使用することをお勧めします。ほとんどの暗号化ライブラリは、暗号化設計についてすでに非常に精通している人を対象としています。暗号化スキームの設計に精通していない場合、暗号ライブラリが提供するプリミティブのレベルが低すぎるため、暗号ライブラリが誤っている可能性があります。これらのプリミティブを適切に組み合わせて完全に安全なスキームにするためには、たくさんの知識が必要です。
ちなみに、コードを読むことは、暗号化設計をレビューするための苦痛で非効率的な方法だと思います。ボランティアによる外部レビューが必要な場合は、時間をかけて標準の暗号/数学表記で暗号化形式の仕様を作成することをお勧めします。大まかに言えば、仕様では、C#の知識やC#固有の要素がなくても、他の誰かが相互運用可能な実装を独自に実装できるように、フォーマットを詳細に定義する必要があります。このような仕様では、使用中の正確なアルゴリズムを指定する必要があります。たとえば、メッセージMを暗号文CにC =(X、AES-CMAC(K1、X))、X = AES-CBC(K0、M)などとして暗号化するとします。独自の暗号化形式を設計する必要がある場合、それはおそらくそれを分析するのに最も適切な抽象化のレベルです。しかし、何よりも、独自の暗号化形式を設計することを避け、それによってそのような分析の必要性を避けることが最善です。