パスワードをデータベースに保存する最良の方法[終了]


475

認証(ユーザー名とパスワード)が必要なプロジェクトに取り組んでいます

また、データベースに接続するので、ユーザー名とパスワードをそこに保存すると思いました。ただし、データベース上にあるテーブルの単なるテキストフィールドとしてパスワードを設定するのは、あまり良い考えではないようです。

C#を使用して、2008 Expressサーバーに接続しています。このタイプのデータを保存する最良の方法は何ですか(可能な限り多くの例を使用して)誰でも提案できますか?

PS正当な理由が提供できる場合、この情報はデータベースに保存されないという考えを受け入れます


1
暗号化を行う場合は、以前の投稿者が述べたように、コードにキーを保存しないでください。それは単に悪い習慣です。
ウッディ、

12
「正しいパスワードの作り方は?」重要な質問です。それは難しい問題であり、間違いは重大な結果をもたらします(テスコとLinkedInに何が起こったかを思い出してください)。私はこの質問がで再オープンするべきだと思うprogrammers.stackexchange.com
大佐はパニック

2
これは、標準に固執する方が良いです-参照en.wikipedia.org/wiki/PBKDF2あなただけの言語での実装を見つけなければならない
ボリスTreukhov

5
:この質問は広範囲のセキュリティフォーラムで回答されsecurity.stackexchange.com/questions/211/...
gioele

回答:


405

プレーンテキストフィールドにパスワードを保存するのは恐ろしい考えです。ただし、場所に関する限り、遭遇するほとんどの場合(そして正直なところ、私は正反対のことは考えられません)、データベースにパスワードの表現を保存することは適切なことです。表現とは、ソルト(ユーザーごとに異なります)と安全な一方向アルゴリズムを使用してパスワードをハッシュし、それを保存て、元のパスワードを破棄することを意味します。次に、パスワードを検証する場合、値をハッシュし(同じハッシュアルゴリズムとソルトを使用)、データベース内のハッシュ値と比較します。

したがって、これについて考えていることは良いことであり、良い質問ですが、これは実際にはこれらの質問の複製です(少なくとも)。

ソルティングビット、パスワードをハッシュして保存することの危険性をさらに明確にするために、侵入者がデータベースを手に入れても、レインボーテーブルと呼ばれるものを使用して、パスワード(少なくともレインボーテーブルに表示されるもの)。これを回避するために、開発者はパスワードにソルトを追加します。これにより、適切に行われた場合、レインボー攻撃を実行することは単に不可能になります。一般的な誤解は、すべてのパスワードに同じ一意の長い文字列を単に追加することであることに注意してください。これは恐ろしいことではありませんが、すべてのパスワードに一意のソルトを追加することをお勧めします。詳しくはこちらをご覧ください。


40
他の場所に保存するのではなく、データベースにパスワードを保存することを意味しました。その文を文脈から外すと、私はプレーンなパスワードの保存をサポートしているように見えます。
Paolo Bergantino、

14
私が言ったことだけでなく、私は彼に塩などについてさらに議論するたくさんの投稿を紹介しました...
Paolo Bergantino '28

1
@Paolo Bergantino:投稿にタイプミスがないのは確かですか?「あなたが遭遇するほとんどの場合(そして正直に言って、どんな反例も考えられません)、データベースにパスワードを保存することが適切なことです」と書かれています。??? コメントと矛盾しているようです
ミッチウィート

3
パオロが言ったことは、それ自体と矛盾しています。パスワードのソルトハッシュはパスワードではありません。データベースにパスワードのソルトハッシュを格納しても、データベースにパスワードは格納されません。回答の本文は完全に適切ですが、その最初の文は非常に誤解を招くものです。
Robert Rossney、2009年

40
@ロバート:それはささいなセマンティクスゲームに危険なほど近づいていますが、それでもそれを修正します...
Paolo Bergantino '28

54

背景 ユーザーのパスワードを知っている必要はありません。着信ユーザーがアカウントのパスワードを知っていることを確認したいだけです。

Hash It: 強力なハッシュ関数を介してハッシュされたユーザーパスワード(一方向暗号化)を保存します。「c#暗号化パスワード」を検索すると、多くの例が表示されます。

ハッシュ関数が生成するものについては、オンラインのSHA1ハッシュクリエーターを参照してください(ただし、ハッシュ関数としてSHA1を使用しないでください。SHA256などの強力なものを使用してください)。

ハッシュ化されたパスワードは、あなた(およびデータベースの泥棒)がそのハッシュを元のパスワードに戻すことができないことを意味します。

使用方法: しかし、あなたは、データベースに保存されているこのマッシュアップされたパスワードをどのように使用するのですか?

ユーザーがログインすると、ユーザー名とパスワードが(元のテキストで)渡されます。同じハッシュコードを使用して、入力したパスワードをハッシュし、保存されているバージョンを取得します。

したがって、2つのハッシュされたパスワードを比較します(ユーザー名のデータベースハッシュと入力されたハッシュされたパスワード)。ハッシュを比較することで、「ユーザーが入力した内容」が「元のユーザーがパスワードに入力した内容」と一致したかどうかを確認できます。

追加クレジット:

質問:私のデータベースがあったら、John the Ripperのようなクラッカーを使って、保存されているハッシュ化されたパスワードと一致するものが見つかるまで、ハッシュを作成することはできませんか?(ユーザーはとにかく短い辞書の単語を選ぶので...それは簡単なはずです)

回答:はい...はい、できます。

したがって、パスワードを「ソルト」する必要があります。塩に関するウィキペディアの記事を参照してください

「ソルトを使用してデータをハッシュする方法」のC#の例を参照してください


14
良い投稿ですが、1つだけ例外があります。md5とsha1の両方が壊れています。おそらくSHA2ファミリーなどのより強力なアルゴリズムを使用する必要があります。
Paolo Bergantino、

3
ありがとうPaolo-あなたは正しいです。SHA2の使用はMD5およびSHA1を使用するのと同じくらい簡単なので、より強力なハッシュアルゴリズムを使用してください。
joej

5
SHA-1は壊れていません。しかし、パラフェーズブルースシュナイアー:歩いて、走らないで、SHA-2へ。
Ian Boyd、

3
「それで、あなたはあなたのパスワードを「ソルト」するべきです」...しかし、ソルトは通常パスワードとともにデータベースに保存されます、それでそれはどのように役立ちますか?攻撃者は、テスト対象の辞書攻撃フレーズにソルトを追加するだけです。重複したパスワードを明らかにしないこと以外に、どのようにしてより安全ですか?
trusktr 2013年

4
@joej「あなたは決して...本当に...ユーザーのパスワードを知る必要はありません」-それは非常に近視眼的な仮定です。取得可能な方法でパスワードを保存しておくことが本当に必要な多くの種類のアプリケーションがあります。たとえば、ユーザーが提供および更新する、保存された資格情報を使用して別のシステムに頻繁にログインする必要があるアプリケーション。
フランシスコサラボゾ2015

29

鍵強化されたソルトハッシュとして、sha-512などの安全なアルゴリズムを使用します。


6
私の意見では、パスワードの格納には、常に(たとえばBlowfishな​​どの)遅いアルゴリズムを使用する必要があります。この記事の方がはるかに良い答えです:security.stackexchange.com/questions/211/…。このページは検索結果の上位に表示されるため、ここに入力してください。
ダイノム2014年

2
パスワードを保存するためのこのアドバイスに従うことは、ひどく間違っているでしょう。
mlissner 2015年

27

最良のセキュリティプラクティスは、パスワードをまったく(暗号化すらされていない)保存するのではなく、暗号化されたパスワードのソルトハッシュ(パスワードごとに一意のソルトを含む)を保存することです。

この方法では、プレーンテキストのパスワードを取得することは(実際には)不可能です。


11
ウェインは、ハッシュを計算する前にソルト処理を行うことで、ソルトが十分なサイズであれば、レインボーテーブルを効果的に無効にします。
マイクローゼンブラム

12
@Wayne Hartman:そうではありません。ソルト値が公開されている場合は、その特定のソルト値に対して新しいレインボーテーブルを生成する必要があります。レインボーテーブルのポイントは、ハッシュ値を事前に計算しておくことです。そして、誰も彼の特定の塩のためのレインボーテーブルを持っていません。
Ian Boyd

10

十分なレインボーテーブル:安全なパスワードスキームについて知っておくべきこと [デッドリンク、インターネットアーカイブにコピーする ]と[ パスワードを安全に保存する方法 ] の記事を読むことをお勧めします。

私も含めて、多くのコーダーはセキュリティとハッシュを理解していると思います。悲しいことに、私たちのほとんどはそうしません。


1
@Johanリンクが壊れているように見えますが、これは残念です。ここに代替のcodahale.com/how-to-safely-store-a-passwordがあります
zebrabox

6

ユーザー名とパスワードの必要性について言及したように、少しトピックから外れているかもしれませんが、私の問題の理解は確かに最善ではありませんが、OpenIDは検討に値するものですか?

OpenIDを使用する場合、私がテクノロジーを正しく理解し、ユーザーがすでに持っている資格情報を使用できれば、アプリケーションに固有の新しいIDを作成する必要がなくなれば、資格情報はまったく保存されません。

問題のアプリケーションが純粋に内部で使用される場合は、適切ではない可能性があります

RPXは、OpenIDサポートをアプリケーションに統合するための素晴らしい簡単な方法を提供します。


私はopenIDが人々の顔を揺さぶるのに同意しますが、このアプリケーションにとってそれは会社の社内データベースであり、古い人がログインすることを望んでいるとは思いません。また、このアプリが正しく動作するためにWebアクセスは必要ないので、私はそれを要求するのは嫌です。
Crash893 2009年

3

シナリオでは、asp.netメンバーシップを確認できます。ユーザーのパスワードをハッシュされた文字列としてデータベースに保存することをお勧めします。ハッシュされた着信パスワードをデータベースに保存されているパスワードと比較することにより、ユーザーを認証できます。

すべてがこの目的のために構築されています。asp.netメンバーシップをチェックしてください


1

ハッシュを逆にする必要がない場合は、パスワードをMD5 / SHA1にします。ユーザーがログインするときに、与えられたパスワードを暗号化してハッシュと比較するだけです。この場合、誰かがデータベースにアクセスして、すでに衝突しているハッシュを見つけない限り、ハッシュ衝突はほぼ不可能です。


2
私はハッシュにMD5を使用しません-それは基本的に壊れています mscs.dal.ca/~selinger/md5collision
zebrabox '28

3
実際、それほど壊れていません。彼らができることは、2つの異なるファイルに対して同じハッシュ値を見つけることです。彼らができないことは、MD5を逆にして有効なパスワードを取得することです。
waiwai933 2009年

2
さて、それも壊れませんか?同じハッシュを生成する他のパスワードを入力するだけでログインできます。元のパスワードを知っている必要はありません。これを修正する方法は、ハッシュする前にパスワードをソルトすることです。
mjuarez 2013

2
@mjuarez MD5を使用する前にパスワードにソルトを追加すると、他のパスワードを使用できないため、衝突は問題になりません
WiiMaxx
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.