1

ユーザーの登録時にデータベースに保存するハッシュ化/ソルト化されたパスワードを提供する単純なパスワード暗号化ツールがあります。コード:

public static string GenerateHashWithSalt(string enteredPassword, string enteredSalt)
    {
        string sHashWithSalt = enteredPassword + enteredSalt;
        byte[] saltedHashBytes = Encoding.UTF8.GetBytes(sHashWithSalt);
        System.Security.Cryptography.HashAlgorithm algorithm = new System.Security.Cryptography.SHA256Managed();
        byte[] hash = algorithm.ComputeHash(saltedHashBytes);
        return Convert.ToBase64String(hash);
    }

ユーザーがログインすると、入力したパスワードをこのコードに戻して比較するだけでは、別の結果が得られると思います。保存したパスワードと入力したログイン パスワードを単純に比較するにはどうすればよいですか?

4

4 に答える 4

5

アカウントが作成されると、パスワードが提供された場所password hashによって入力される列がありGenerateHashWithSalt(password, salt);、ソルトがランダムに生成されます。ソルトは、パスワード ハッシュと一緒に保存されます。

次に、ユーザー名/パスワードが有効かどうかを確認する必要がある場合は、storedpassword == GenerateHashWithSalt(providedPassword, saltFromDb)またはそのようなものを使用します。同じ結果が得られた場合は、正しいパスワードを入力したことがわかります

于 2013-02-27T19:51:05.003 に答える
2

私は、salted-hashed-password-equivalent スキームがどのように機能するかについての簡単なチュートリアルを作成しました。ただし、質問をしているという事実に基づいて、これは安全なログオンプロセスを確保するための最初のステップにすぎないことに注意する必要があります。初心者の場合は、自分で作成しようとするのではなく、セキュリティの専門家を雇うか、既製のソリューションを購入する必要があります。システムの安全性を損なうような、思いもよらない間違いを犯す方法は数多くあります。

http://blogs.msdn.com/b/ericlippert/archive/tags/salt/

于 2013-02-27T20:38:11.203 に答える
0

これを正しく行うには、いくつかの手順があります。

まず、次の 3 つが必要です。

  1. ユーザーが提供するパスワード。(それをpと呼びましょう)
  2. 作成する文字のランダムな文字列。これはソルトとして知られています (これをsと呼びます)
  3. 暗号化ハッシュ関数 (よくh (x)と呼びます)

上記の 3 つのことで、保存したいh ' を計算できます: h ' = h ( s + p )

ユーザーのパスワードは決して保存されません。データベースにはsh 'のみを保存します。

ソルトを暗号化する必要はありません。データベース内のすべてのパスワードに対して一意である必要があります。

ユーザーが将来再びログインしようとすると、データベースに保存されている元のソルトを使用してh ' を再計算します。新しいh ' がデータベースにあるものと等しい場合、ユーザーのパスワードは同じです。

于 2013-02-27T20:15:14.830 に答える
0

パスワードを比較する方法だけが必要な場合は、これが役立つかもしれません:暗号化/復号化

于 2013-02-27T20:04:25.470 に答える