問題タブ [pbkdf2]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - Rfc2898DeriveBytes を使用した C# での PBKDF2 の実装
皆さん、私は C# で WPA 共有キーを作成する PBKDF2 関数を実装しようとしています。ここでいくつか見つけました: http://msdn.microsoft.com/en-us/magazine/cc163913.aspx有効な結果を生成しているように見えますが、1 バイトが短すぎます...そして間違った PSK 値です。
出力をテストするために、これと比較しています: http://www.xs4all.nl/~rjoris/wpapsk.htmlまたはhttp://anandam.name/pbkdf2/
Rfc2898DeriveBytes と呼ばれる C# の組み込みライブラリでこれを機能させる 1 つの方法を見つけました。これを使用して、次を使用して有効な出力を取得します。
ここで、Rfc2898DeriveBytes を使用する際の 1 つの制限は、「ソルト」の長さが 8 オクテットでなければならないことです。短い場合、Rfc2898DeriveBytes は例外をスローします。私がしなければならないことは、salt を 8 バイトにパディングすることだけだと思っていました (短い場合)。しかし、いいえ!パディングと短いソルトのほとんどすべての組み合わせを試しましたが、上記の 2 つの Web サイトから得た結果を複製することはできません。
要するに、これは Rfc2898DeriveBytes が 8 バイトより短いソースソルトでは単に機能しないということですか? もしそうなら、WPA 事前共有キー用に PBKDF2 を実装するために使用できる C# コードを知っている人はいますか?
.net - .NET で SlowAES と RijndaelManaged クラスを取得して一緒にプレイする
javascript ライブラリSlowAESと .NET のRijndaelManagedクラスを使用して、AES 暗号化/復号化をセットアップしようとしています。
この投稿を読んだ後、私はこの方法を選択しました。 Cheeso は、これら 2 つの暗号化方法を一緒にプレイすることができました。
「COM-wrapped-SlowAE のテストでは、CBC モードを使用しました。暗号化は .NET の RijndaelManaged クラスと完全に互換性がありました」 - Cheeso
Cheeso の Windows Scripting Component から JavaScript コード、最新の Slowaes ライブラリを取得し、次の JavaScript スクリプトを使用してテストしました。
次の出力が得られます。
MSDNにある次の例を変更して、C# の暗号化と一致するようにしました。
バイト配列のウォッチ:
マネージド .NET クラスですべてのパディング オプションを試しましたが、暗号化された出力を一致させることができません。誰でも私を助けることができますか?
ありがとう、
ボブ
.net - PasswordDeriveBytesとRfc2898DeriveBytes、廃止されましたが、はるかに高速です
TripleDes、DESなどのSymmetricAlgorithmから継承されたクラスに基づく暗号化機能に取り組んでいます。
基本的に、アルゴリズムクラスの一貫したキーとIVを生成するための2つのオプションがPasswordDeriveBytes
ありRfc2898DeriveBytes
、どちらもDeriveBytes抽象クラスから継承します。
このPasswordDeriveBytes.GetBytes()
メソッドは、.NET Frameworkで廃止としてマークされていますが、PBKDF2標準に一致するため、Rfc2898DeriveBytes.GetBytes()をお勧めします。ただし、私のテストに基づくと、GetBytes()
Rfc2898DeriveBytesクラスで同じメソッドを呼び出すと、クラスのメソッドよりもほぼ15倍遅くなり、PasswordDeriveBytes
予期しないCPU使用率(常に50%を超える)が発生します。
ここにいくつかのテストデータがあります:
- 反復:100
- アルゴリズムタイプ:DES
- 元のテキスト:「私はテストキーです。暗号化してください」
- 時間:
- PasswordDeriveBytes:99ms
- Rfc2898DeriveBytes:1,373ms
テストに基づくと、のパフォーマンスの低下はRfc2898DeriveBytes
実稼働環境では許容できません。
誰かが以前にこの問題に気づいたことがありますか?パフォーマンスに影響を与えることなく、標準のソリューションを引き続き使用できるソリューションはありますか?廃止された方法を使用するリスクはありますか(将来のバージョンで削除される可能性があります)?
みんなありがとう!
編集:
おそらく問題がどこにあるかを見つけました...のデフォルトの反復回数PasswordDeriveBytes
は100ですが、Rfc2898DeriveBytes
は1000です。1000と同じ数に変更した後、実行Rfc2898DeriveBytes
は2倍の時間になります。
security - PBKDF2 をパスワード ハッシュとして使用するための標準はありますか?
脆弱なパスワード ハッシュとの戦いに参加してください。
PBKDF2 パスワード ハッシュには、後で検証できるように、salt、反復回数、およびハッシュ自体が含まれている必要があります。RFC2307 の {SSHA} のような PBKDF2 パスワード ハッシュの標準形式はありますか? BCRYPT は優れていますが、PBKDF2 の方が実装が簡単です。
どうやら、仕様はありません。これが私のスペックです。
更新: 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} よりも何倍もコストがかかるはずです。
key - MD5を使用してパスワードから暗号化キーを生成しますか?
私はファイル暗号化のための簡単なプログラムを書いています。主に学術的な演習としてですが、将来の深刻な使用のために使用される可能性があります。面倒な作業はすべてサードパーティのライブラリを使用して行われますが、暗号化を行わない人にとっては、安全な方法でそれらをまとめることは依然として非常に困難です。基本的に、私はほぼすべてが私が思うように機能している。
128ビットのキー長の暗号化に128ビットのAESを使用しています。ユーザーが可変長のパスワードを入力できるようにしたいので、MD5でパスワードをハッシュしてから、そのハッシュをキーとして使用することにしました。これは許容できると思いました。キーは常に秘密であると想定されているため、衝突攻撃について心配する必要はありません。
これを実装したので、これが悪い考えであることを示すいくつかの記事に出くわしました。私の質問は:なぜですか?適切なパスワードが選択された場合、暗号はそれ自体で十分に強力であり、並外れた(現在は実行不可能な)ブルートフォース攻撃を除いて、キーを明らかにすることはありません。キーを生成するためにPBKDF2のようなものを使用する必要がありますか、それとも最も極端な暗号化アプリケーションを除くすべてのアプリケーションにとってそれはやり過ぎですか?
sha1 - PBKDF2-HMAC-SHA1
WPA2 ネットワークの有効なペアワイズ マスター キーを生成するために、ルーターは PBKDF2-HMAC-SHA1 アルゴリズムを使用します。PMK を取得するために sha1 関数が 4096 回実行されることは理解していますが、そのプロセスについて 2 つの質問があります。
擬似コードですみません。
1) SHA1 関数の最初のインスタンスへの入力はどのようにフォーマットされていますか? SHA1("ネットワーク名"+"ネットワーク名の長さ"+"ネットワークパスワード")
その順序でフォーマットされていますか? ネットワーク名、長さ、パスワードの 16 進値ですか、それともストレート ASCII ですか?
次に、私が収集したものから、受信した 160 ビット ダイジェストは、追加のソルティングなしで別のハッシュ ラウンドに直接供給されます。このように: SHA1("ハッシュの最後のラウンドからの 160 ビット ダイジェスト") 立ち上がり、繰り返します。
2) これが 4096 回発生すると、出力の 256 ビットがペアワイズ マスター キーとして使用されます。私が理解できないのは、SHA1 が 160 ビットの出力を生成する場合、アルゴリズムはどのようにしてキーに必要な 256 ビットに到達するのでしょうか?
助けてくれてありがとう。
c# - Bouncy Castle C# の PBKDF2
PBKDF2 キーの派生を行う方法を見つけるために、C# Bouncy Castle API をいじっています。
私は今本当に無知です。
Pkcs5S2ParametersGenerator.cs および PBKDF2Params.cs ファイルを読んでみましたが、その方法がわかりません。
私がこれまでに行った調査によると、PBKDF2 には、パスワードである文字列 (または char[])、ソルト、および反復カウントが必要です。
これまでのところ、最も有望で最も明白なものは、PBKDF2Params と Pkcs5S2ParametersGenerator です。
これらのどれも、文字列または char[] を受け入れていないようです。
誰かが C# でこれを行ったことがありますか、またはこれについて何か手掛かりがありますか? それとも、Java で BouncyCastle を実装したことがあり、助けてくれる人はいますか?
事前にたくさんありがとう:)
更新: Bouncy Castle でこれを行う方法を見つけました。答えは以下をご覧ください:)
iphone - PBKDF2-HMAC-SHA256 Objective-C の実装
Objective-C で、HMAC-SHA256 を使用してキーを生成する PBKDF2 の実装を教えてください。これは、後で AES-CBC-Pad 暗号化に使用するキー生成プロセスの一部です。
前もって感謝します
cryptography - SHA1はPBKDF2でハッシュ関数として使用するためにまだ安全ですか?
SHA1の暗号解読には大きな進歩があったため、SHA2を優先して段階的に廃止される予定です(ウィキペディア)。
ただし、PBKDF2の基になるハッシュ関数として使用する場合は、基本的にPRNGとして使用されます。そのため、SHA1をPBKDF2のハッシュとして使用することは安全ですよね?