2009-03-05 15 views
75

データベース(好ましくはSQL Server 2005)にパスワードを格納するために推奨する方法/データ型は何ですか?私がいくつかのアプリケーションで行ってきた方法は、最初に.NET暗号化ライブラリを使用してデータベースにバイナリ(16)として保存することです。これが推奨される方法ですか、別のデータ型を使用するのか、16よりも多くの領域を割り当てる必要がありますか?データベースにパスワードを保存する好ましい方法

+1

私は、これはだまされやすい人かもしれ感が、何それは実際のDBのログインについてであることが判明し、ちょうどアプリケーション/サイトを保存しないで、私はだまされやすい人かもしれ考えを持っていますログイン。 – TheTXI

+1

「暗号化」機能と「ハッシュ」機能のどちらを使用しているかを説明するために質問を明確にしてください。私はあなたが後者を意味すると思いますが、その違いは非常に重要です。 – ine

答えて

80

私は、常にユーザーが渡されたものの生成1にハッシュを比較し、データベースにパスワードの塩漬けハッシュ同等と決してパスワード自体を保存する。

それは今までリテラルを保存するためにあまりにも危険ですパスワードデータはどこにでもあります。これは回復を不可能にしますが、誰かがパスワードを忘れたり失ったりすると、いくつかのチェックを実行して新しいパスワードを作成することができます。

+0

@クイントン:これは私のやることです。 .net暗号化ライブラリでは、パスワードをハッシュアップし、それをDBに渡してバイナリとして保存します。私は、ユーザーの入力をハッシュし、格納されているものと比較するだけでパスワードを比較することができます。 – TheTXI

+0

あなたは正しい軌道に乗っているように思えます。 –

+1

javaを使用している場合はjbcryptをお勧めします。非常に簡単に使用する –

15

私はあなたが記述したのと同じことをしますが、それは文字列として格納されます。 Base64は暗号化されたバイナリ値をエンコードします。割り当てられるスペースの量は、暗号化アルゴリズム/暗号強度に依存する。

あなたはそれを正しくやっていると思います(Saltを使用した場合)。

+2

ここで本当の質問に対処するため+1。 – erickson

46

推奨される方法:パスワードをDBに保存しないでください。そのハッシュのみ。味に塩を加える。

+5

モッドアップ、それをやらなければならなかった、塩の冗談だけでした;) – Jakub

+0

私もそれに笑った。 –

8

ハッシュ関数の結果は、0〜255(または8ビットデータ型の符号付き数に応じて-128〜127)の範囲の一連のバイトであるため、生のバイナリフィールドとして格納します最もコンパクトな表現であり、追加の符号化および復号化ステップを必要としないので、最も理にかなっている。

データベースやドライバの中には、バイナリデータ型を十分にサポートしていないものや、開発者が使い慣れていないものがあります。その場合、Base-64やBase-85のようなバイナリからテキストへのエンコーディングを使用し、結果のテキストを文字フィールドに格納することは許容されます。

必要なフィールドのサイズは、使用するハッシュ関数によって決まります。 MD5は常に16バイトを出力し、SHA-1は常に20バイトを出力します。ハッシュ関数を選択すると、既存のパスワードをすべてリセットする必要があるため、通常はハッシュ関数に慣れています。だから、可変サイズのフィールドを使っても何も買わない。

ハッシュを実行するための "最良の" 方法について

、私はそのトピックに関する他のSOの質問に多くの答えを提供しようとしました:

+0

私の質問をちょっと詳しく読んでみると、フィールドに割り当てられたデータ型とスペースに関して、実際のストレージにもっと集中していることがわかります。 – TheTXI

+0

しかし後で来るかもしれない他の人に余分な情報を提供するために+1。 – TheTXI

+0

右に。それは私がそれを逃した唯一の人ではないように見える;) – erickson

8
  1. ストア塩漬けパスワードのハッシュ、例えばbcryptのような(nounce + PWD)。 CPU集約型にチューニングできるため、SHA1またはMD5でbcryptを使用することができます。
  2. いくつかのログインエラー(brute-force攻撃を避けるため)の後にログインフォームにcaptchaを追加する
  3. アプリケーションに「パスワードを忘れました」というリンクがある場合は、代わりに、ユーザーが新しいパスワードを定義できるように(安全な)ページへのリンクを送信する必要があります(たとえば、ユーザーの生年月日などの一部の個人情報を確認してから)。また、アプリケーションでユーザーが新しいパスワードを定義できる場合は、ユーザーに現在のパスワードを確認させる必要があります。

    1. =>オフライン辞書攻撃:
    2. と、明らかに、ログインフォーム(通常はHTTPSで)を確保し、サーバー自体これらの施策により

    、ユーザーのパスワードはかなりよくから保護されます

  4. =>ライブ辞書攻撃
  5. サービス攻撃攻撃の
  6. =>あらゆる種類の
  7. =>拒否!
+0

これらのすべての手段は、迅速に実装することができ、最小限の努力のためのかなりのパンチをパック! +1 =) –

+0

DOS攻撃はパスワードセキュリティに関連していますか? – Arj

+1

@ a12jun:あなたのウェブサイトに単純な「ログイン」入力と「新しいパスワードを生成して電子メールで私に送信してください」ボタンを使って「パスワードを忘れました」リンクがある場合、あなたのログインを知っている人あなたのパスワードを変更するように強制することができます。 10秒ごとにこれを自動実行すると、彼はあなたのアカウントへのアクセスを拒否することができます。何千人ものユーザーに対してこれを実行すれば、おそらく多くのユーザーがサービスを嫌う可能性があります。ガイドライン#3はこれに対してあなたを守ることができます。それは私が意味することです(それはあまり明確ではありませんでしたが、私は認めなければなりません)。セキュリティ=機密性、整合性、***可用性***。 – MiniQuark

4

単純なパスワードのハッシュ、または(salt + password)のパスワードは、一般的には適切ではありません。

は、以下を参照してください。

http://www.matasano.com/log/958/enough-with-the-rainbow-tables-what-you-need-to-know-about-secure-password-schemes/

http://gom-jabbar.org/articles/2008/12/03/why-you-should-use-bcrypt-to-store-your-passwords

どちら

はbcryptのアルゴリズムをお勧めします。ほとんどの一般的な言語では、無料の実装をオンラインで見つけることができます。

+0

表面的なセキュリティ上の懸念を超える偉大なリンク。故意に遅いアルゴリズムの場合、クライアント側で計算されたハッシュを持つことが重要になります(おそらく既にビジー状態の可能性があります)。 – cheduardo

+0

本当にありません。目標は単にそれを「やや遅く」することです。ちょうどあなたに考えを与えるために。クワッドコアシステムでは、SHA1ハッシュを毎秒約200Kのパスワードで処理できます。私は誰もが200Kの同時ログインを処理する必要があるのか​​疑問に思っています。だから、PBKDF2やbcryptのような機能を使って、毎秒100ハッシュ(200の倍数でブルートフォースのタイムラインを増やします) –

2

ASP.Netを使用している場合は、組み込みのメンバーシップAPIを使用できます。

これは、さまざまなタイプのストレージオプションをサポートしています。片方向ハッシュ、双方向暗号、md5 + salt詳細についてはhttp://www.asp.net/learn/securityをご覧ください。

あなたがあまりにも派手なことを必要としない場合、これはウェブサイトに最適です。

あなたがここにASP.Netを使用していない場合は、4guysから数記事への良好なリンクであると私は、ユーザー名のSHAハッシュ、でGUIDを使用

http://aspnet.4guysfromrolla.com/articles/081705-1.aspx http://aspnet.4guysfromrolla.com/articles/103002-1.aspx http://www.codeproject.com/KB/security/SimpleEncryption.aspx

4

をCodeProjectのWeb設定、およびパスワードは、varchar(40)として保存されます。彼らが無理な力や辞書を使いたいのであれば、guidのためにWebサーバーをハックする必要があります。パスワードが見つかると、ユーザー名がデータベース全体に虹のテーブルを作成して壊れます。ユーザーがユーザー名を変更したい場合は、同時にパスワードをリセットするだけです。

System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(
    username.ToLower().Trim(), 
    ConfigurationManager.AppSettings("salt"), 
    password 
); 
+0

私はユーザー名をsaltとして使用しました。しかし、ユーザーの名前を変更できませんでした。私たちはsaltをuserのid、guid、sid、または他の代理キーで置き換えました。 –

+0

真実、良い呼び出し。この方法では、ユーザーの名前を変更するときにパスワードをリセットする必要はありません – Shawn

3

データベースに複数のハッシュを使用できますが、ちょっとした労力がかかります。将来的に追加のフォーマットをサポートする必要性が最も遠いと思うのであれば十分です。私は頻繁に

{hashId} $ {塩} $ {ハッシュされたパスワード}「hashIdは、」私はそれを認識するために内部的に使用し、単にいくつかの数、例えばある

、私が使用しているSHA1のようなパスワードエントリを使用します特定のハッシュパターンで"salt"はbase64でコード化されたランダムな塩です。 「ハッシュされたパスワード」はbase64でエンコードされたハッシュです。ハッシュを移行する必要がある場合は、古いパスワード形式のユーザーを傍受し、次回のログイン時にパスワードを変更することができます。

何かをするのは簡単なので、ハッシュに注意したいH(salt、password)はH(password、salt)よりもはるかに弱いですが、これと同時にサイトコンテンツの価値とのバランスを取る必要があります。私はよくH(H(パスワード、塩)、パスワード)を使用します。

最後に、テキストデータが必要なさまざまなツールを使用できる利点と比べて、base64でエンコードされたパスワードを使用するコストはわずかです。ええ、柔軟性が高いはずですが、レコードごとに数バイトを節約したいので、お気に入りのサードパーティツールを使用できないと上司に伝えますか? :-)

他のコメントを追加するために編集しました:私は意図的に各パスワードの1/10秒をハッシュするアルゴリズムを意図的に使用することを提案した場合、私の上司のオフィスからただ笑って幸運になります。 (それほど幸運なことではありませんか?彼は次の年次レビューで議論するために何かを書き留めるでしょう)。数十人、あるいは何百人ものユーザーがいるときは、その時間を燃やすことは問題ではありません。 100,000人のユーザーを押している場合は、通常複数のユーザーが同時にログインします。遅くて強くないものが必要です。 "しかし、クレジットカード情報はどうですか?"保存されているクレジットカード情報は通常のデータベースのどこにも置かれてはならず、個々のユーザーではなくアプリケーションによって暗号化されるため、

+0

ハッシングには、高速かつ強力なものはありません。ごめんなさい。それがあなたのために速ければ、ブルートフォースの攻撃者にとっては速いです。キー導出関数の使用は、パスワード強化のための有効な方法です。 –

2

あなたの質問は保存方法&サイズに関するものですので、その点についてお答えします。

ストレージタイプは、バイナリ形式またはテキスト形式(base64が最も一般的です)です。バイナリは小さいですが、私はテキストを使って作業するのが簡単です。ユーザーごとの塩漬け(パスワードごとに異なる塩)を行う場合、salt + hashを単一の結合文字列として保存する方が簡単です。

サイズはハッシュアルゴリズムに依存します。 MD5の出力は常に16バイト、SHA1は常に20バイトです。 SHA-256 SHA-512はそれぞれ32 & 64バイトです。テキストエンコーディングを使用している場合は、エンコーディング方法に応じて多少のストレージが必要になります。私はBase64を使う傾向があります。なぜなら、ストレージは比較的安いからです。 Base64は約33%の大きなフィールドを必要とします。

ユーザーごとに塩漬けがある場合は、ハッシュのためのスペースも必要です。 64ビット塩+ SHA1ハッシュ(160ビット)のbase64でエンコードすると40文字になりますので、char(40)として保存します。

最後に、1つのハッシュではなく、RBKDF2のようなキー導出機能を使用してください。 SHA1とMD5のハッシュは非常に高速です。 1つのスレッドアプリケーションでも、クワッドコアマシンで毎秒200Kのパスワードで約30Kから50Kのパスワードをハッシュできます。 GPUは1秒あたり100xから1000xまでのパスワードをハッシュできます。ブルートフォース攻撃は受け入れ可能な侵入方法になります。 RBKDF2では、反復回数を指定して、ハッシングが「遅い」方法を微調整することができます。ポイントはシステムを無意味にすることではなく、ハッシュスループットの上限(たとえば、毎秒500ハッシュ)を上限にするように、いくつかの反復を選択することではありません。将来の証明方法は、反復回数をパスワードフィールド(iterations + salt + hash)に含めることです。これにより、将来的にはより強力なプロセッサーに対応するための反復回数を増やすことができます。将来的により大きい/代替のハッシュを可能にするために、さらに柔軟にvarcharを使用すること。

.NET実装であるRFC2892DeriveBytes http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.aspx

関連する問題