4

データの暗号化を検討しています。パスワードに基づいて暗号化キーを生成し、時間などの移動値を生成したいと考えています。目標は、キーを変更することですが、パスワードを知っている人なら誰でも復号化できるようにすることです。これはC#で発生しています。次のコードを使用してパスワードをハッシュしています。

private static string GetPasswordHash(string password)
{
    TimeSpan span = (DateTime.UtcNow - new DateTime(1900, 1, 1));
    string result = Convert.ToInt32(span.TotalHours).ToString();
    result += password;
    result += Convert.ToInt32(span.TotalDays).ToString();
    result = Convert.ToBase64String(SHA256.Create().ComputeHash(Encoding.ASCII.GetBytes(result)));
    return result;
}

次に、そのハッシュとソルトを使用してキーを生成します。

        Rfc2898DeriveBytes rdb = new Rfc2898DeriveBytes(GetPasswordHash(password), salt);
        rdb.IterationCount = 1000;

        RijndaelManaged rm = new RijndaelManaged();
        rm.KeySize = 256;
        rm.Key = rdb.GetBytes(32);
        rm.IV = rdb.GetBytes(16);

私がこれを行う方法には問題があるようです。一部のコンピューターが異なるタイムゾーンにある場合、またはデータを送信するときに時が刻む場合、またはマシンの時刻がわずかにずれている場合。より良い提案はありますか?

4

5 に答える 5

8

標準的な戦略は、値 (時間など) だけを送信し、暗号化キーと共に送信することです。使用している値は公開情報であるため、最初にパスワードを作成した人が「動く値」を公開しても問題ありません。ソルトを参照してください。あなたがしていることは新しい技術ではありません。キー強化も使用されているようです。

于 2009-08-12T13:26:22.860 に答える
2

変更部分 (暗号化されていない) を暗号化されたデータと一緒に送信するだけで、秘密のパスワードを知っている人なら誰でも暗号化に使用されたパスワードを簡単に再構築できます。変更部分は比較的推測しやすいため、安全性が大幅に低下することはありません。

于 2009-08-12T13:25:44.717 に答える
1

現在の時刻を中心に、時間枠にわたって同じ移動値を生成するスキームを見つけることができます。したがって、12 時間のウィンドウを選択すると、6 時間遅れて 6 時間進んだすべてのコンピュータが同じ暗号化キーを生成します。

于 2009-08-12T13:24:50.740 に答える
0

同じパスワードで暗号化された同じデータのファイルが同じように見えるのではないかと心配ですか?現在の時刻で初期化ベクトルを設定し、パスワードを使用して暗号化することができます。復号化するには、同じIV値を使用します(したがって、これはファイルとともに暗号化せずにどこかに保存する必要があります)。

于 2009-08-12T13:45:31.013 に答える
0

パスワード ベースのキー派生は、.net で既に実装されています。関数 GetPasswordHash() に問題は見られませんが、暗号でライブラリ関数を使用する価値は常にあります。これは、より適切にテストされ、小さなエラーがシステムのセキュリティを完全に破壊する可能性があるためです。ここに 2 つのリンクがありますが、おそらく他にもあるでしょう。

rfc2898derivebytes

passwordderivebytes

于 2009-08-13T15:48:09.463 に答える