3

私が勤めている会社では、大型注文処理システムのサポート契約を結んでいます。最初のシステム監査の一環として、データベースに保存されているパスワードが実際にはパスワードのハッシュコードであることに気付きました。

基本的に:

string pwd = "some pasword";
string securePwd = pwd.GetHashCode();

私の質問は、これがどれほど安全か、またはそうでないかです。

私はそれに慣れていませんが、GetHashCode がどのように機能するかについて十分に知りません。MD5 ハッシュのようなものを使用したいと思いますが、時間を無駄にしている場合は気にしません。

4

6 に答える 6

5

などのソルト化された、暗号的に強力なハッシュを使用する必要がありますSHA256Managed

Jeff Attwood は、このトピックに関するいくつかの優れた投稿をしています。

レインボー ハッシュ クラッキング

パスワードの保存方法が間違っている可能性があります

于 2009-03-04T10:55:00.913 に答える
5

安全でないだけでなく、変更される可能性もあります。

http://netrsc.blogspot.com/2008/08/gethashcode-differs-on-systems.html

特定の入力に対して GetHashValue によって返される値は、過去に変更されています。

アプリの異なる実行間で同じになるという保証はありません。

于 2009-03-04T10:58:09.563 に答える
4

GetHashCodeハッシュ値として 32 ビット整数を返します。誕生日のパラドックスを考慮すると、衝突に強くなるように明示的に設計されていたとしても、衝突の可能性が比較的高いため、十分な長さのハッシュ値ではありません。

このようなタスクを処理するために設計された SHA256 または別の暗号的に安全なハッシュ関数を使用する必要があります。

パスワードを保存するには、単純なハッシュ関数を使用するだけでは不十分です。ユーザーごとにランダムな「ソルト」を追加し、十分な回数反復して、ブルートフォースの計算コストが高くなるようにする必要があります。したがって、反復回数が多い bcrypt 、scrypt、 PBKDF2 などを使用する必要があります。

于 2009-03-04T10:54:19.977 に答える
2

代わりにBCryptを使用することをお勧めします。他の人がすでに言っているように、パスワードに GetHashCode を使用するのは良い考えではありません。

于 2009-03-04T11:37:59.873 に答える
1

GetHashCode は、実装が異なるオブジェクトに対して異なるハッシュを返すことを保証しないため、この方法で使用するようには設計されていません。これは、複数のパスワードが同じハッシュを生成する可能性があることを意味します。また、異なるバージョンの .NET フレームワークで同じハッシュ値を返すことは保証されていません。つまり、アップグレードによって同じ文字列に対して異なるハッシュが生成される可能性があり、パスワードが使用できなくなる可能性があります。

プッシュ時にソルト ハッシュまたは MD5 を使用することをお勧めします。Security.Cryptography名前空間内のものに簡単に切り替えることができます。

于 2009-03-04T10:59:13.337 に答える
1

他の人が言ったように、GetHashCode はあなたがしようとしていることのために設計されていません。ユーザーのパスワードを安全に処理する方法については、非常に優れた記事があります。

この記事を要約すると、 bcryptなどの比較的低速なアダプティブ ハッシュ スキームを使用するか、代わりにStanford Secure Remote Password Protocolを使用する必要があります。私は前者を提案します。もちろん、塩も使うべきです。

于 2009-03-04T11:21:20.023 に答える