[解決済み] なぜ、パスワードを鍵やIVとして直接使用するのではなく、Rfc2898DeriveBytesクラス(.NET)を使用する必要があるのでしょうか?
質問
Rfc2898DeriveBytes を使う場合と、単に
Encoding.ASCII.GetBytes(string object);
?
私はどちらの方法でも比較的成功しています。前者はより長ったらしいアプローチで、後者はシンプルで要領が良いです。どちらも最終的には同じことをすることができるようですが、前者を後者より使用することの意味を理解するのに苦労しています。
私が把握できた基本的なコンセプトは、文字列のパスワードをバイト配列に変換して
バイト配列に変換して、たとえば対称型暗号化クラスで使用できることです。
AesManaged
. RFCクラスを介してですが、rfcオブジェクトを作成する際にソルト値とパスワードを使用するようになります。私はその方がより安全だと思いますが、それでもせいぜい無学な推測に過ぎません。また、特定のサイズのバイト配列を返すことができること、まあそのようなものです。
私がどこから来たかを示すために、いくつかの例を挙げます。
byte[] myPassinBytes = Encoding.ASCII.GetBytes("some password");
または
string password = "P@%5w0r]>";
byte[] saltArray = Encoding.ASCII.GetBytes("this is my salt");
Rfc2898DeriveBytes rfcKey = new Rfc2898DeriveBytes(password, saltArray);
rfcKey' オブジェクトは、対称型暗号アルゴリズムクラスの .Key または .IV プロパティを設定するために使用することができます。 を設定するために使用することができます。
すなわち
RijndaelManaged rj = new RijndaelManaged ();
rj.Key = rfcKey.Getbytes(rj.KeySize / 8);
rj.IV = rfcKey.Getbytes(rj.Blocksize / 8);
'rj'は準備完了です !
紛らわしいのは......つまり、'rfcKey' オブジェクトを使うのではなく、私の 'myPassInBytes'配列を使用して、'rj'オブジェクトをセットアップすることはできないのでしょうか?
VS2008 でこれを試してみましたが、即座の答えは「NO」でした。しかし、なぜ RFC クラスが、私が上記で述べた他の選択肢よりも使用されるのか、より教育された答えを持っていますか?
どのように解決するのですか。
ユーザーパスワードを直接暗号鍵として使用することは、本当に、本当に避けたいことです。 特に AES では特にそうです。
Rfc2898DeriveBytes は PBKDF2 の実装です。これは、ユーザーパスワードとソルトを繰り返しハッシュ化するものです。これには複数の利点があります。
まず、任意のサイズのパスワードを使用できます。AESは特定のキーサイズしかサポートしていません。
第二に、ソルトの追加は、複数の異なる鍵を生成するために同じパスフレーズを使用できることを意味します (あなたの例のように、ソルトが一定でないと仮定しています)。これは、鍵の分離にとって重要です。異なるコンテキストで鍵を再利用することは、暗号化システムが破壊される最も一般的な方法の 1 つです。
複数の反復処理 (デフォルトでは 1000) は、パスワード推測攻撃の速度を低下させます。誰かがあなたの AES 鍵を推測しようとしている場合を考えてみてください。パスワードを使用するだけなら、これは簡単なことです。一方、PBKDF2の場合、攻撃者はまず1000回のハッシュ反復を行い、その結果 それぞれの のハッシュ化を1000回行う必要があります。したがって、ユーザーの速度はわずかに低下しますが、攻撃者にとっては不釣り合いな効果があります。(実際には、より高い反復回数を使用することは非常に一般的であり、10000 が一般的に推奨されています)。
また、最終的な出力キーが一様に分布していることを意味します。たとえば、パスワードを使用した場合、通常、鍵の128ビットのうち16ビットは0(高ASCIIビット)になります。このことは、パスワードの推測を無視したとしても、キーサーチを直ちに 65536 倍も簡単にしてしまいます。
最後に、AES には関連する鍵の攻撃に関する特定の脆弱性があります。関連キー攻撃は、攻撃者がいくつかのキーで暗号化されたデータを知っていて、それらの間に何らかの既知の(または推測された)関係がある場合に可能です。例えば、パスワードキーとして "My AES key sucks" (16 bytes, for AES-128) と "MY AES KEY SUCKS" の両方でデータを暗号化した場合、関連キー攻撃が可能かもしれません。現在最もよく知られている攻撃は、実際にはこの方法でAES全体を破ることはできませんが、時間とともに徐々に良くなってきています。ちょうど先週、関連キー攻撃を使ってAES-256の13ラウンド(合計14ラウンドのうち)を破る新しい攻撃が発表されました。先週、関連する鍵攻撃を使ってAES-256の13ラウンド(全14ラウンド中)を破る新しい攻撃が発表されました。このような攻撃が時間とともに改善されないことに依存するのは、非常に賢明ではありません。
関連
-
[解決済み】ここで「要求URIに一致するHTTPリソースが見つかりませんでした」となるのはなぜですか?
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】MetadataException: 指定されたメタデータ・リソースをロードできない
-
[解決済み】Visual studio 2019がデバッグ時にフリーズする件
-
[解決済み】HRESULTからの例外:0x800A03ECエラー
-
[解決済み】「namespace」なのに「type」のように使われる。
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】別のスレッドがこのオブジェクトを所有しているため、呼び出し側のスレッドはこのオブジェクトにアクセスできない
-
[解決済み] C#を使用して.NETで現在のユーザー名を取得する方法は?
-
[解決済み] .NETを使用して16進数のカラーコードから色を取得するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] 'SubSonic.Schema .DatabaseColumn' 型のオブジェクトをシリアライズする際に、循環参照が検出されました。
-
[解決済み】ソケットのアドレス(プロトコル/ネットワークアドレス/ポート)は、通常1つしか使用できない?
-
[解決済み】「入力文字列が正しい形式ではありませんでした」エラーの解決方法は?[重複しています]。
-
[解決済み】Socket.Selectがエラー "An operation was attempted on something that is not a socket" を返す。
-
[解決済み】EF 5 Enable-Migrations : アセンブリにコンテキストタイプが見つかりませんでした
-
[解決済み】ランダムなブーリアンを生成する最速の方法
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】パラメータ付きRedirectToAction
-
VSでscanfエラーを恒久的に解決するには、ソースファイルを作成し、自動的に#define _CRT_SECURE_NO_WARNINGS 1を追加してください。
-
[解決済み】スレッド終了またはアプリケーションの要求により、I/O操作が中断されました。