12

脆弱なパスワード ハッシュとの戦いに参加してください。

PBKDF2 パスワード ハッシュには、後で検証できるように、salt、反復回数、およびハッシュ自体が含まれている必要があります。RFC2307 の {SSHA} のような PBKDF2 パスワード ハッシュの標準形式はありますか? BCRYPT は優れていますが、PBKDF2 の方が実装が簡単です。

どうやら、仕様はありません。これが私のスペックです。

>>> from base64 import urlsafe_b64encode
>>> password = u"hashy the \N{SNOWMAN}"
>>> salt = urlsafe_b64decode('s8MHhEQ78sM=')
>>> encoded = pbkdf2_hash(password, salt=salt)
>>> encoded
'{PBKDF2}1000$s8MHhEQ78sM=$hcKhCiW13OVhmLrbagdY-RwJvkA='

更新: http://www.dlitz.net/software/python-pbkdf2/crypt()で代替が定義されています。$p5k2$彼がではなく で始まることを除いて、私は彼に合わせて私の小さな仕様を更新しました{PBKDF2}。(他の LDAP スタイルの {SCHEMES} から移行する必要があります)。

{PBKDF2}、小文字の 16 進数の反復回数、$urlsafe_base64エンコードされたソルト、$およびurlsafe_base64エンコードされた PBKDF2 出力です。ソルトは 64 ビットで、反復回数は少なくとも 1000 である必要があり、HMAC-SHA1 出力を持つ PBKDF2 は任意の長さにすることができます。私の実装では、デフォルトで常に 20 バイト (SHA-1 ハッシュの長さ) です。

パスワードは、PBKDF2 経由で送信する前に utf-8 にエンコードする必要があります。Unicode の NFC に正規化する必要があるかどうかについては何も言われていません。

このスキームは、iterationsブルート フォースに対して {SSHA} よりも何倍もコストがかかるはずです。

4

2 に答える 2

4

弱いハッシュとの戦いに参加します。

OWASPには、いくつかのガイダンスが記載されたパスワードストレージチートシート( https://www.owasp.org/index.php/Password_Storage_Cheat_Sheet )があります。彼らは、2012年の時点で最低64,000のPBKDF2反復を推奨しており、2年ごとに2倍になります(つまり、2012年には90,510回)。

ユーザーIDごとに暗号的にランダムな長いソルトを保存することは常に基本であることに注意してください。

ユーザーごとの反復回数が大きく変動し、反復回数をソルトとともに保存すると、クラッキングソフトウェアが複雑になり、特定の最適化が妨げられる可能性があることに注意してください。たとえば、「bob」は135817回の反復で暗号化されますが、「alice」は95,121回の反復を使用します。つまり、2013年の最小値は(90510 + RAND(90510))です。

また、ユーザーが「password」、「Password1!」、「P @ $$ w0rd」、「P @ $$ w0rd123」などの弱いパスワードを選択できる場合は、これらすべてが役に立たないことにも注意してください。ルールベースの辞書攻撃は確かに非常に迅速です(後者は、次のルールを持つ単純な「パスワード」です:大文字の最初の文字、1337-話す、最後に3桁の数字を追加します)。基本的な辞書リスト(phpbb、良い、小さなスターターワードリスト)を取り、このようなルールを適用すると、人々が「巧妙な」トリックを試みる非常に多くのパスワードを解読できます。

したがって、新しいパスワードをチェックするときは、「P @ $$ w0rd123」がこの一見非常に厳しい規則に準拠しているため、「上、下、数字、数字の4つすべて、少なくとも11文字の長さ」を適用しないでください。代わりに、その基本的な辞書リストを使用して、基本的なルールがそれをクラックするかどうかを確認します(実際にクラックを試みるよりもはるかに簡単です。リストとその単語を小文字にして、「最後の4文字が一般的な年、最後の4文字を除くすべてを単語リストと照合します」、「最後の3文字を除くすべてを数字と照合します」、「最後の3文字を除くすべてを単語リストと照合します」、「最後の2文字を除くすべてを単語リストと照合します」および「パスワードをDe-1337-@をaに、3をeに、というように変換します。

パスフレーズに関する限り、特に単語の途中に他の文字が追加されている場合は、一般的に優れたアイデアですが、十分な長さがある場合に限り、可能な組み合わせをたくさんあきらめているためです。

GPUを搭載した最新のマシンは、2012年でも、1秒あたり最大数百億回のハッシュ反復(MD5、SHA1、SHA-256、SHA-512など)であることに注意してください。パスワードを入力します。これはせいぜい非常に控えめなパスワードです。スペースを含む長さ7以下のすべて小文字の英語の単語は4つだけです。したがって、180億のXKCDスタイルのパスワードを探しに行くと、2番目の設定が推測されます。現代の小さなアメリカ英語辞書には次のようなものがあります。長さ5以下の6k語長さ7以下の21k語長さ9以下の36k語46k語長さ11以下の長さ13以下の49k語

XKCDスタイルのパスフレーズを使用し、人気で単語をフィルタリングすることなく(「正しい」、「椅子」、「ダンピア」、「出血」)、21k ^ 4になります。これは、約2E17の可能性にすぎません。180億/秒のセットアップ(単一のSHA1反復に直面している場合は8つのGPUを備えた単一のマシン)では、キースペースを徹底的に検索するのに約4か月かかります。そのようなセットアップが10回あった場合、それは約2週間です。「dumpier」のようなありそうもない単語を除外した場合、最初のパスをすばやく実行する方がはるかに高速です。

さて、「Balsamina」や「Calvinistically」(どちらも「go to row」機能を使用して選択)など、「巨大な」Linuxアメリカ英語の単語リストから単語を取得すると、長さ5または長さ7以下の115kワード以下長さ9以下の231kワード長さ11以下の317kワード長さ13以下の362kワード

長さの最大制限が7であっても、この巨大な辞書をベースとしてランダムに選択された単語を使用すると、115k ^ 4〜= 1.8E20の可能性があります。セットアップが最新の状態に保たれている場合は、約12年です(18か月ごとに電力が2倍になります)。 )。これは、13文字、小文字+数字のみのパスワードに非常によく似ています。「300年」はほとんどの見積もりでわかることですが、ムーアの法則を考慮に入れていません。

于 2013-01-02T16:30:30.953 に答える
4

PBKDF2 のパラメーター(salt と iterations) の仕様はありますが、ハッシュは含まれていません。これは、PKCS #5 バージョン 2.0に含まれています(付録 A.2 を参照)。一部のプラットフォームには、この ASN.1 構造のエンコードとデコードのサポートが組み込まれています。

PBKDF2 は実際にはキー派生関数であるため、「ハッシュ」(実際には派生キー) を派生パラメーターと一緒にバンドルする方法を指定しても意味がありません。通常の使用では、キーはそのままにしておく必要があります。秘密であり、保存されることはありません。

ただし、一方向のパスワード ハッシュとして使用する場合は、ハッシュをパラメーターと共にレコードに格納できますが、独自のフィールドに格納できます。

于 2009-09-24T18:34:21.000 に答える