パスワードをソルトする:ベストプラクティス?


162

私はいつも好奇心旺盛でした...ハッシュのためにパスワードをソルトするときにどちらが良いですか:プレフィックス、またはポストフィックス?どうして?それとも、塩漬けであれば問題ありませんか?

説明するには:データベースに保存するためにパスワードをハッシュする前に、パスワードをソルトする必要があることを(願わくば)わかっているはずです[ 編集:最近Jeff Atwoodで起こったことなどを避けることができます]。通常、これはソルトをパスワードと連結してから、ハッシュアルゴリズムに渡すことによって行われます。しかし、例は異なります...一部の例は、パスワードの前にソルトを付加します。一部の例では、パスワードのにソルトを追加しています。塩を真ん中に入れようとする人も見ました。

それで、どちらがより良い方法で、なぜですか?ハッシュの衝突の可能性を減らす方法はありますか?私のグーグルは、そのテーマに関してまともな分析をしていません。

編集:すばらしい回答者の皆さん!一つだけ答えてすみませんでした。:)



1
@Jaccco:素晴らしい入力。ありがとう!
Randolpho

3
ベストプラクティスは、PBKDF2(標準)、bcrypt、またはscryptのいずれかを使用して、ソルティングを実行する暗号化関数を使用することです。それを指摘してくれたスティーブンに感謝します。
Maarten Bodewes 2012

1
ほとんどすべての標準的なパスワードハッシュ構造がソルトとパスワードの組み合わせを処理するため、これについて心配する必要はありません。標準のパスワードハッシュを使用しない場合は、ハッシュに移行してください。
CodesInChaos 2013

1
@オム悪い推薦。1)SHA-1の1回の反復は速すぎます。少なくとも10000を使用する必要がありますが、それでもかなり弱いです。2)デフォルトのソルトが小さすぎます。8バイトが最小で、16バイトが推奨されます。
CodesInChaos 2013

回答:


111

接頭辞または接尾辞は関係ありません。それは、パスワードにエントロピーと長さを追加することについてのみです。

次の3つのことを考慮する必要があります。

  1. ソルトは、保存するパスワードごとに異なる必要があります。(これはよくある誤解です。)
  2. 暗号で保護された乱数ジェネレータを使用します。
  3. 十分に長い塩を選択してください。誕生日の問題について考えてください。

ユーザー名(または他の個人データ)の代わりにランダムに生成されたソルトを使用する必要がある別の質問に対するDave Sherohmanによる優れた回答があります。これらの提案に従えば、どこに塩を入れてもかまいません。


4
古い質問へのリンクを追加しました。それらの回答を読んでください。基本的に、パスワードごとに別のランダムなソルトを使用しないことで、不要なセキュリティリスクを負うことになり、将来的に問題になる可能性があります。
GeorgSchölly2009年

39
攻撃者がレインボーテーブルを事前計算してユーザーデータベース全体を取得できるため、サイト全体のランダムソルトは不適切です。これを理解していない場合は、ログイン/セキュリティシステムを作成しないでください:)-ユーザーごとのソルトが必要です。
スネマーチ2009年

3
はい、ユーザーごとのソルト。理想的には、ユーザーごとの反復が保存されている(そのため、時間の経過とともに使用される反復の数を増やすことができます)。適切なフレームワークには、この機能が組み込まれています。(.NETには、すべてを処理するPasswordDeriveBytesがあります。)
MichaelGG 2009年

2
あらゆる種類のセキュリティシステムを設計している場合、ユーザーごとのソルトを使用しないのは頭の痛い問題です。あなたのサイトはそれほど興味深いものではないかもしれませんが、ユーザーが複数のサイトで同じパスワードを使用することを検討してください...データベースの安全を維持しようとすると失敗する傾向があります:)
snemarch 2009年

2
もちろん、ソルトは辞書攻撃を防御します。正確には、攻撃をより遅くします。パスワードにソルトを使用することは、レインボーテーブルよりもはるかに古いものです。ソルトは、攻撃者がパスワードを一度ハッシュしてからすべてのユーザーと比較するのを防ぐことにより、辞書攻撃を遅くするために特別に追加されました。
Glenn Maynard

27

それはすべて意味論だと思います。非常に具体的な脅威モデルを除いて、それを前後に配置することは重要ではありません。

そこにあるという事実は、レインボーテーブルを倒すことになっています。

私が言及した脅威モデルは、攻撃者パスワードに追加/追加された一般的な塩のレインボーテーブルを持つことできるシナリオです。(NSAを言ってください)あなたは彼らがそれを付け加えたか、付け加えたかのどちらかであると推測していますが、両方ではありません。それはばかげている、そしてそれは悪い推測です。

これらには、これらのレインボーテーブルを格納する能力があると想定した方がよいでしょう。その中狭い場合、私が散在することは最高のだろうと推測します。

私が言ったように。それは意味論です。パスワードごとに異なるソルト、長いソルトを選択し、記号やASCIIコードなどの奇数文字をその中に含めます:©¤¡


@onebyone、くそー!彼は私の「passwordsalt」の塩を発見しました!
サムエル

6
@サミュエル:君たちのことは知らないが、塩には「12345」を使っている。:)
Randolpho

@onebyoneは有効です。私は「共通」を「文字セットYの長さX未満のすべてのソルト」として実際に意味し、X、Yは妥当です。20文字と英数字の大文字/小文字を言います。私はハッシュ化されたハッシュの虹のテーブルは有用であろうと思いますので、..(160と言う)の長さZの下にあるすべての16進文字列を言うために拡張可能
トム・リッター

1
@ランドルフォ:ねえ、それも私の塩です!オッズは何ですか?
エイドリアン

:そして塩は/非予測可能であることを確認してくださいランダムstackoverflow.com/questions/1645161/...
Jacco

18

本当の答えは誰も触れていないようですが、どちらも間違っているということです。あなたがあなた自身の暗号化を実装している場合は、どんなに些細なA部分あなたは、あなたがやっていると思うんうとしているミスを作ること。

HMACの方が優れていますが、SHA-1などを使用している場合でも、速度の設計上、パスワードハッシュに適さないアルゴリズムをすでに選択しています。bcryptまたはおそらくscryptのようなものを使用して、問題を完全に解決します。

ああ、結果のハッシュがプログラミング言語やデータベース文字列比較ユーティリティと等しいかどうか比較することさえ考えないでください。それらfalseは文字ごとに比較し、文字が異なるかのように短絡します。したがって、攻撃者は統計的手法を使用して、一度に1文字ずつ、ハッシュとは何かを試すことができます。


1
最後の段落に関して:比較が失敗した文字の正確な数に関する情報を攻撃者はどのように取得できますか?これは意味がありません..
halloweenlv 2017年

1
あなたは正しいと間違っています。タイミング攻撃は実際のものであり、比較がどこで失敗したかを正確に判断するために、可変遅延ネットワーク接続を介してさえ、恐ろしい精度で実行可能であることが繰り返し実証されています。とはいえ、出力の小さな部分のみを変更する入力を見つけることは計算上不可能であるため、タイミング攻撃は実際には一般的なパスワードハッシュには適用できません。
Stephen Touset 2017年

9

違いはありません。塩をどこに置いても、ハッシュは簡単に推測できなくなります。ハッシュの衝突は、意図的に非線形であるため、まれであり、予測不可能です。それがセキュリティに変化をもたらした場合、それはソルティングではなくハッシュの問題を示唆します。


1
ハッシュの衝突は、ハッシュのサイズに依存します。誕生日のおかげで衝突の可能性はかなり高くなります。
GeorgSchölly2009年

2
結果を切り捨てた場合のみ。とにかく、ハッシュのポイントは入力と出力の関係にパターンが含まれないようにすることなので、ソルトがどこにあるかは変わらないという点で私はまだ待機しています。
Phil H

7

暗号化された安全なハッシュを使用する場合、プレフィックスの前置か後置かは問題ではありません。ハッシュのポイントは、ソースデータの単一ビットの変更(場所に関係なく)が異なるハッシュを生成することです。

重要な、しかし、適切な暗号PRNGとそれらを生成し、長い塩を使用し、ユーザごとの塩を持っています。ユーザーごとのソルトをデータベースに格納することはセキュリティ上の問題ではありません。サイト全体のハッシュを使用するのです。


2
間違ったアンサー:メッセージダイジェストはストリーミングをサポートするために段階的に機能するため、攻撃者は頻繁に使用される多くのパスワードのMD(pass)を事前計算してから、MD(pass + salt)を非常に安価に計算できます。
Erwan Legrand

5

まず、「レインボーテーブル」という用語は一貫して誤用されています。「レインボー」テーブルは特別な種類ですのルックアップテーブルであり、キーで特定の種類のデータ圧縮を可能にします。計算をスペースと交換することにより、1000 TBを必要とするルックアップテーブルを1000回圧縮して、より小さなドライブドライブに格納できます。

パスワードルックアップテーブルへのハッシュ、レインボーなどについて心配する必要があります。

@ onebyone.livejournal.com:

攻撃者は、辞書の単語のハッシュではなく、ハッシュ計算を完了する直前のハッシュ計算の状態で構成される「レインボーテーブル」を持っています。

次に、接頭辞saltよりも接尾辞saltを使用してパスワードファイルエントリを総当たりにする方が安価な場合があります。辞書の単語ごとに、状態を読み込み、ソルトバイトをハッシュに追加して、それを確定します。接頭辞付きのソルトを使用すると、各辞書の単語の計算に共通点はありません。

単純な線形合同ジェネレータなど、入力文字列を線形スキャンする単純なハッシュ関数の場合、これは実用的な攻撃です。ただし、暗号化された安全なハッシュ関数は意図的に複数のラウンドを持つように設計されています。各ラウンドは入力文字列のすべてのビットを使用するため、ソルトを追加する直前の内部状態の計算は、最初のラウンド後は意味がありません。たとえば、SHA-1には80ラウンドあります。

さらに、PBKDFのようなパスワードハッシュアルゴリズムはハッシュ関数を複数回構成します(PBKDF-2を最低1000回反復し、各反復でSHA-1を2回適用することをお勧めします)。この攻撃は二重に非現実的です。


ラウンドの説明を再確認してください。ラウンドは、メッセージ全体ではなく、チャンクごとに行われます。(それ以外の場合は、ストリーミングデータをハッシュすると何度も巻き戻す必要があります。)しかし、反復を使用すると、1人1人が言及する問題が回避されます。
MichaelGG 2009年

4

プラットフォームにプロバイダーがある場合、BCryptハッシュ。塩の作成について心配する必要がなく、必要に応じて塩をさらに強くする方法が大好きです。


3
私が知っている変数と同じように、BCrypt Hashは他のハッシュスキームと同様にソルティングが必要です。
ジャッコ2010

2

パスワードに任意の文字数のソルトを挿入することは、最も予想されないケースであり、したがって社会的には最も「安全」ですが、パスワードごとに長くユニークなものを使用している限り、一般的なケースではそれほど重要ではありません。塩の文字列。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.