7

データベースに保存するパスワードを安全にハッシュするための良い方法が次のとおりかどうか教えてください。

    public string CreateStrongHash(string textToHash) {

        byte[] salt =System.Text.Encoding.ASCII.GetBytes("TeStSaLt");

        Rfc2898DeriveBytes k1 = new Rfc2898DeriveBytes(textToHash, salt, 1000);
        var encryptor = SHA512.Create();
        var hash = encryptor.ComputeHash(k1.GetBytes(16));

        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < hash.Length; i++) {
            sb.Append(hash[i].ToString("x2"));
        }

        return sb.ToString();

    }

よろしくお願いします。

4

2 に答える 2

7

あなたはPBKDF2-SHA1を使用していますが、これはまともですが素晴らしいものではありません。Bcryptは少し優れており、scryptはさらに強力です。しかし、.netにはすでに組み込みのPBKDF2実装が含まれているため、これは許容できる選択です。

あなたの最大の間違いは、あなたが塩のポイントを得られなかったことです。ソルトはユーザーごとに一意である必要があります。少なくとも64ビットのランダムな値を単純に作成するのが標準的な方法です。ハッシュと一緒にデータベースに保存します。

必要に応じて、塩を2つの部分に分割できます。1つはユーザーと一緒にデータベースに保存され、ユーザーごとに異なります。もう1つは、他の場所に保存されている共有パーツです。これにより、両方の利点が得られます。

また、よりも高いworkfactorを使用することをお勧めし1000ます。許容できるパフォーマンスを把握し、それに応じて調整します。私は10000を下回ることはなく、状況によっては(ディスク暗号化)100万も許容されます。

于 2012-08-31T16:04:13.623 に答える
5

改善することができます。まず、代わりにbcryptを使用する必要があります。SHA-512のような従来のハッシュは、今日のGPUを使用するとかなり簡単に破ることができます。問題は、これらのハッシュが速度を重視して設計されていることです。これは、パスワードハッシュで必要なものとは逆です。Bcryptは適応ハッシュアルゴリズムの一例です。総当たり攻撃を困難にするために、「長い」時間がかかるように構成できます(ただし、システムのパフォーマンスの問題は発生しません)。

また、各ユーザーに固有のソルトを作成する必要があります。

パスワードを安全にハッシュする方法の詳細については、この質問を参照してください。

于 2012-08-31T16:02:12.273 に答える