GetHashCodeを使用して“安全に”ユーザーのパスワード
-
03-07-2019 - |
質問
私が働いている会社は、大規模な注文処理システムのサポート契約を結んでいます。最初のシステム監査の一環として、データベースに保存されているパスワードは実際にはパスワードのハッシュコードであることに気付きました。
本質的に:
string pwd = "some pasword";
string securePwd = pwd.GetHashCode();
私の質問は、これはどれくらい安全か、それ以外の場合ですか?
私はそれに慣れていませんが、GetHashCodeがどのように機能するかについては十分に知りません。 MD5ハッシュのようなものを使用したいのですが、時間を無駄にしている場合は気にしません。
解決
GetHashCode
は、ハッシュ値として32ビット整数を返します。 誕生日のパラドックスを考慮すると、衝突の可能性が比較的高いため、十分な長さのハッシュ値ではありません、たとえ衝突耐性があるように明示的に設計されていても、そうではありません。
このようなタスクを処理するために設計されたSHA256または別の暗号的に安全なハッシュ関数を使用する必要があります。
パスワードを保存するには、単純なハッシュ関数を使用するだけでは不十分です。ランダムな「塩」を追加する必要があります。ユーザーごとに十分な回数繰り返して、ブルートフォースを行うには計算コストがかかるようにします。そのため、bcrypt、 scrypt 、PBKDF2などを多数の反復で使用する必要があります。
他のヒント
SHA256Managed
などの暗号化された強力なハッシュを使用する必要があります。
Jeff Attwoodには、このトピックに関する優れた投稿がいくつかあります。
安全ではないだけでなく、変更される可能性があります:
http://netrsc.blogspot.com/2008/ 08 / gethashcode-differs-on-systems.html
特定の入力に対してGetHashValueによって返される値は過去に変更されました。
アプリの異なる実行間で同じである保証さえありません。
BCrypt 。他の人がすでにGetHashCodeをパスワードに使用するのは良い考えではないと言っているように。
GetHashCodeは、実装が異なるオブジェクトに対して異なるハッシュリターンを保証しないため、この方法で使用するように設計されていません。これは、複数のパスワードが同じハッシュを生成する可能性があることを意味します。また、.NETフレームワークの異なるバージョンで同じハッシュ値を返すことは保証されていません。つまり、アップグレードにより、同じ文字列に対して異なるハッシュが生成され、パスワードが使用できなくなる可能性があります。
プッシュ時にソルトハッシュまたはMD5を使用することをお勧めします。 Security.Cryptography 内で簡単に切り替えることができます。 a>名前空間。
他の人が言ったように、GetHashCodeはあなたがしようとしていることのために設計されていません。本当にユーザーパスワードを安全に処理する方法に関する優れた記事。
記事を要約するには、 bcrypt 、または Stanford Secure Remote Password Protocol 。前者をお勧めします。そしてもちろん、塩も使うべきです。