2016-08-30 27 views
0

私は簡単な部分である文字列を暗号化するプロジェクトに取り組んでいます。難しい部分は、衝突ドメインで値を返す暗号化の前に文字列をハッシュする方法を見つけることです。そのハッシュは暗号化された文字列と共にデータベーステーブルに格納されます。C#ハッシュの衝突ドメイン

これを行う理由は、単一のレコードを検索する必要があるときに復号化するためのサブセットを作成するためです。これはC#を使ってどのように達成できますか?

+0

コリジョンドメインの作成やハッシュの作成には、どんな助けが必要ですか? –

+1

ここでいくつの衝突が起こっていますか?ユニークなハッシュだけをチェックすることを確認することが唯一の目的ならば、そのチェックに値するチェックを行うには多くの衝突が必要で​​す。 Scott Chamberlain氏の答えによると、ハッシュは悪意のある人に情報を漏らしてしまうため、暗号化が弱くなるという。 –

+1

また、衝突をチェックする必要がある場合は、ハッシュを格納することをお勧めします。値を取り戻す必要がある場合は、ハッシュ - >暗号化されたデータのルックアップテーブルを格納して、同じプレーンテキストからの複数のブロブの暗号化データを格納しないようにします。 –

答えて

0

あなたが衝突ドメインを作成する手助けが必要な場合は、最も簡単な方法は、衝突の可能性が高い新しい文字列に文字列を変換して、その新しい文字列を検索値にハッシュする関数を作成することです。あなたはその後、自分の好みのハッシュアルゴリズムでCreateCollisionの出力をハッシュする必要が

private static int COLLISION_LENGTH = 5; 
public static string CreateCollision(string oldValue) 
{ 
    var chars = new char[COLLISION_LENGTH]; 

    for(int i = 0; i < oldValue.Length; i++) 
    { 
     chars[i % chars.Length] ^= oldValue[i]; 
    } 

    return new String(chars); 
} 

は、私はあなたのような強力なハッシュ方式を使用することをお勧めしますRfc2898DeriveBytesのようなパスワードのために、あなたのようなハッシュを扱う(パスワードだろうただし、このハッシュは暗号化したデータに関する情報を漏らすため、固定されたsaltを使用する必要があります)。

必要に応じてCOLLISION_LENGTHを調整します。

+0

もう少し考えてみたら、実際にAdler32の実装を使って値を計算することができます。 Adler32がすべての組み合わせを見つけて同じ値を作成できるかどうかは誰にも分かりますか? – schwietertj

+0

入力に依存しますが、テキストに固定の書式があり、テンプレートと結果の間にいくつかの単語だけが異なる場合は、単語の場所を辞書攻撃して、どの単語がどこに移動するかを把握することができますハッシュの結果 –

+0

私は個人識別番号を扱っているので、間違いなく私の質問に答えます。私は、System.Security.Cryptography.HashAlgorithmを使って、ドットネットコアに実装されていると思う値を生成すると考えています。 – schwietertj