web-dev-qa-db-ja.com

データベースにパスワードを保存するための最良の方法

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

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

私はC#を使用しており、2008 Expressサーバーに接続しています。このタイプのデータを保存するための最良の方法は何か(できるだけ多くの例を挙げて)提案できますか?

正当な理由が提供されることができるならば、私はこの情報がデータベースに格納されないという考えにオープンです

433
Crash893

平文のフィールドにパスワードを保存するのは、horribleという考えに正しいのです。しかし、は場所がになる限り、あなたが遭遇しようとしているほとんどのケースでは(そして私は正直にはどんな反例も考えられない)データベース内のパスワードのRepresentationを実行するのが適切です。言い換えると、salt(ユーザーごとに異なるはずです)と安全な1-wayアルゴリズムを使用してパスワードをハッシュし、thatを使い捨てにするということです。元のパスワード次に、パスワードを検証するときに、値をハッシュし(同じハッシュアルゴリズムとsaltを使用して)、それをデータベース内のハッシュ値と比較します。

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

塩漬けのビットについてもう少し明確にするために、単にパスワードをハッシュしてそれを保存することの危険性は、侵入者があなたのデータベースを手に入れたとしても、 Rainbowとして知られるものを使うことができるということですテーブル でパスワード(少なくともRainbowテーブルに表示されるもの)を「復号化」できるようにします。これを回避するために、開発者はパスワードに salt を追加します。これが適切に行われると、Rainbow攻撃を単純に実行不可能にします。よくある誤解は単純に同じユニークで長い文字列をすべてのパスワードに追加することです。これはhorribleではありませんが、すべてのパスワードに固有の塩を追加するのが最善です。 もっと読むには

379

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

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

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

現在、パスワードがハッシュ化されているということは、あなた(そしてデータベース窃盗犯)はそのハッシュを元のパスワードに戻すことができないはずであることを意味します。

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

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

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

追加クレジット:

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

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

それで、あなたはあなたのパスワードを「塩漬け」するべきです。塩についての ウィキペディアの記事を参照してください

「saltでデータをハッシュする方法」のC#の例を参照してください。

49
joej

Sha-512などの安全なアルゴリズムを使用して、鍵を強化した塩味のハッシュとして。

30
nilamo

セキュリティ上の最善策は、パスワードをまったく(暗号化しないでも)保存するのではなく、暗号化パスワードの(パスワードごとに一意のsaltを持つ)塩味のハッシュを保存することです。

そのようにすると、プレーンテキストのパスワードを取得することは(事実上)不可能です。

26
Mitch Wheat

レインボーテーブルで十分:安全なパスワードスキームについて知っておくべきこと [dead link、 インターネットのアーカイブにコピーする ]および パスワードを安全に保存する方法

私自身も含め、たくさんのコーダーがセキュリティとハッシュを理解していると思います。残念ながら、私たちのほとんどはそうではありません。

10
zebrabox

あなたがユーザ名とパスワードの必要性を述べたように私はわずかに話題から外れるかもしれません、そして問題の私の理解は最善ではありませんが、OpenIDは考慮に値するものですか?

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

問題のアプリケーションが純粋に内部使用のためであるならばそれは適切でないかもしれませんが

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

6
Crippledsmurf

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

すべてがこの目的のために構築されています。チェックアウトする asp.netメンバーシップ

3
Ray Lu

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

2
waiwai933