2009-03-04 8 views
3

私が働いている会社は、大型注文処理システムのサポート契約を結んでいます。最初のシステム監査の一環として、私は、データベースに格納されたパスワードが実際にはパスワードのハッシュコードであることに気付きました。基本的にGetHashCodeを使用してユーザーのパスワードを「安全」にする

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

私の質問は、これはどのように安全なかそうでないのか?

私はそれに慣れていませんが、GetHashCodeの仕組みについては十分に分かりません。私はMD5ハッシュのようなものを使うことを好むでしょうが、私が時間を無駄にしているなら、私は気にしません。

答えて

4

GetHashCodeは、32ビット整数をハッシュ値として返します。 birthday paradoxを考慮すると、衝突耐性となるように明示的に設計されていても、比較的高い衝突確率のために十分長いハッシュ値ではありません。

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

パスワードを保存するには、単純なハッシュ関数を使用するだけでは不十分です。ユーザーごとにランダムな「塩」を追加し、十分な時間を繰り返すことで、無理な力を計算するのに費用がかかります。したがって、bcryptのようなもの(scrypt、PBKDF2)を繰り返し使用する必要があります。

+0

SHA1とMD5が壊れていませんか? –

+0

壊れた定義方法によって異なります。衝突する値を計算する方法はよく知られていますが(少なくとも私はMD5でこの事例は確信していますが)、それが役に立たないわけではありません。ほとんどの場合、塩漬けのMD5でもパスワードを保存するのに十分です。それらの「壊れた」属性は、デジタル署名にはるかに影響します。 –

+0

ああ、私は、どのような意味でも、MD5またはSHA1の使用を推奨していません。 Mitchの言ったように、SHA256以上のハッシュアルゴリズムを使用してください。私のコメントの全体的なポイントは、 "壊れた"ものでした。暗号化アルゴリズムでは、broken = deadとなります。しかし、ハッシュアルゴリズムでは、少し灰色の領域があります。 –

5

SHA256Managedなど、暗号化された強力なハッシュを使用する必要があります。

ジェフ・アットウッドはこのトピックに関するいくつかの良い記事があります。

Rainbow Hash Cracking

You're Probably Storing Passwords Incorrectly

+0

downvoter:コメントを残してください。 –

5

それだけで安全ではないが、また、変更されることはありません。

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

指定された入力に対してGetHashValueによって返された値が過去に変更されました。

アプリの異なる実行間で同じことさえ保証されることはありません。

+0

+1リンクされた例では、.NET Frameworkにパッチを当てる単純なWindows Updateの後でもハッシュ値の計算が変更されることが示されています。これは誰ももうログインできないことを意味します。 –

1

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

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

1

他の人が言っているように、GetHashCodeはあなたがやろうとしているもののために設計されていません。実際にはexcellent article on how to handle user passwords securelyがあります。

この記事を要約すると、bcryptのような比較的緩慢な適応型ハッシュスキーム、あるいはStanford Secure Remote Password Protocolのいずれかを使用する必要があります。私は前者を提案します。もちろん、塩を使うべきです。

+0

SRPはパスワードハッシュの選択と直交します。それはまだビルディングブロックとして良い遅いハッシュを必要とします。残念なことに、多くのSRP実装では高速な実装が使用されます。 – CodesInChaos

+0

ユーザーパスワードを安全に処理するための答えのリンクは、一部のncctrust Webサイトのホームページにあります。あなたはそれを修正できますか? – saurabh64

+0

@ saurabh64、ありがとう、私はそのリンクを修正しました。 – RoadWarrior

2

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

関連する問題