0

以下の同じ方法を使用して、同じ平文を 2 回暗号化しますが、暗号化後の暗号文は同じではありません。なぜですか?

ユーザー情報をデータベースに保存する際にパスワードを暗号化したいのですが、以下の暗号化方式を利用したいのですが、旧パスワードと新パスワードを入力後、選択したユーザーIDからユーザーを見つけ出し、ユーザー編集機能を完成させたいのですが、古いパスワードを暗号化し、入力した古いパスワードがデータベースに保存されているパスワードと一致することを検証しようとします。しかし、正しいパスワードを入力しても一致しませんでした。同じ方法を使用してパスワードを暗号化します。

    //encrypt the plainText
    public static string Encrypt(string plainText)
    {
        if (plainText == null || plainText == "")
            throw new ArgumentNullException("plainText");
        var temp = Encoding.UTF8.GetBytes(plainText);

        byte[] encrypted = ProtectedData.Protect(temp, null, DataProtectionScope.CurrentUser);
        return Convert.ToBase64String(encrypted);
    }
4

3 に答える 3

3

ProtectedData クラスの MSDN ドキュメントに基づくと、マシン固有またはユーザー固有のキーを使用して双方向の暗号化を実行しているようです。つまり、キーをアクティブにチェックしているマシンまたはユーザーが、最初にキーを暗号化したマシンと異なる場合、ガベージ結果が得られます。パスワードの有効性のみを確認したい場合は、復号化をサポートする双方向暗号化ではなく、一方向の安全なハッシュ アルゴリズムをお勧めします。StackOverflow の他の投稿では、安全なハッシュ アルゴリズムの使用について説明しています ( What is the most secure hashing algorithm in the .NET Framework? )。

編集:さまざまなユーザーのさまざまなシステムでこのコードをテストしていませんが、マシンまたはユーザー キーに基づいているとは思わないため、より普遍的に機能すると予想されます。

System.Security.Cryptography.SHA256Managed sha = new System.Security.Cryptography.SHA256Managed();
byte[] hashed = sha.ComputeHash(System.Text.Encoding.UTF8.GetBytes(args[0]));
Console.WriteLine("Hash of {0}={1}", args[0], Convert.ToBase64String(hashed));

編集 2:また、暗号化に関する私の理解では、ハッシュ値に「塩」を含める必要があることも示唆されていることを付け加えておきます。つまり、パスワード文字列をハッシュする前に (入力時とチェック時の両方で) 何か (ユーザー名など) をパスワード文字列の末尾に追加して、同じパスワードを持つユーザーが同じハッシュ値にならないようにします。たとえば、 .

于 2013-09-10T14:25:33.447 に答える
1

出力のランダム性は、実際には暗号化の機能です

次の 2 つの選択肢があります。

  • 要件の一部として暗号化された形式からパスワードを回復する必要がある場合は、暗号化を使用しますが、予想されるパスワードと入力されたパスワードを比較する前に結果を解読してください。

  • パスワードを復元する必要が本当にない場合は、代わりに (適切なソルトを使用して) ハッシュ アルゴリズムを使用します。2 つのハッシュ値を比較できます。

于 2013-09-10T14:34:54.023 に答える