4

パスワードを暗号化して保存したい。私はsha256を使用しました。私のコードは以下の通りです

public static string ComputeHash(string plainText)
    {
        int minSaltSize = 4;
        int maxSaltSize = 8;

        Random random = new Random();
        int saltSize = random.Next(minSaltSize, maxSaltSize);

        byte[] saltBytes = new byte[saltSize];
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        rng.GetNonZeroBytes(saltBytes);

        byte[] plainTextBytes = Encoding.UTF8.GetBytes(plainText);
        byte[] plainTextWithSaltBytes = new byte[plainTextBytes.Length + saltBytes.Length];

        for (int i = 0; i < plainTextBytes.Length; i++)
            plainTextWithSaltBytes[i] = plainTextBytes[i];

        for (int i = 0; i < saltBytes.Length; i++)
            plainTextWithSaltBytes[plainTextBytes.Length + i] = saltBytes[i];


        HashAlgorithm hash = new SHA256Managed();
        byte[] hashBytes = hash.ComputeHash(plainTextWithSaltBytes);
        byte[] hashWithSaltBytes = new byte[hashBytes.Length + saltBytes.Length];

        for (int i = 0; i < hashBytes.Length; i++)
            hashWithSaltBytes[i] = hashBytes[i];

        for (int i = 0; i < saltBytes.Length; i++)
            hashWithSaltBytes[hashBytes.Length + i] = saltBytes[i];

        string hashValue = Convert.ToBase64String(hashWithSaltBytes);
        return hashValue;
    }

ユーザーがログインするときに、このパスワードを確認したいのですが、どうすればよいですか??

4

1 に答える 1

13

ユーザーから平文のパスワードを取得し、同じアルゴリズムでハッシュして、新しく生成されたハッシュとデータベース内に保存されているハッシュを比較します。両方のハッシュが同じ場合、ユーザーは正しいパスワードを入力しました。

アップデート

毎回新鮮なランダムソルトを使用するため、異なるハッシュにつながります。使用するソルトを含む新しい列をデータベース内に作成し、これを取得するだけです。

ソルトをハッシュと一緒に保存することは、セキュリティ上の問題ではありません。ソルトは、直接使用される場合、単一のハッシュアルゴリズムに対して事前に計算されたレインボーテーブルの単純な使用のみを禁止します。使用された実際のパスワードについての手がかりはなく、ソルトがプレーンテキストのパスワードとどのように組み合わされているか (先頭に追加、追加、織り込まれているなど) についても手がかりが得られないため、次に安全に保存できます。生成されたハッシュに。

于 2013-01-23T07:42:43.960 に答える