さて、対称暗号についてほどんど議論しつくしたが、 次の話題に移る前に 議論しておきたいちょっとしたものが少しある。 まず最初に言っておきたいことは、 私たちがどのようにある鍵から小さな鍵をつくっていくかについてだ。 そしてこの問題は実際にいつもつきまとう問題なんだ。 だからみんながこの問題にどう正しく対処したらよいか、 明らかにしておきたい。 どのような設定にしようか? よし、色んな方法で作成されたある元となるキーがあるとしよう。 そのあるキーはPRGによって作成されたか、 またはあとで話す鍵交換プロトコルというものから作成されたとする。 まあいずれにせよ、 アリスとボブの間で作成されるキーの作り方はたくさんある。 攻撃者に知られていない鍵がね。 さて、言ったようにさまざまな場合で、 セッションを安全なものにするためには実際あるひとつの鍵ではなく、 たくさんの鍵が必要なんだが、 たとえば、もし覚えているなら、TLSは1方向の鍵が必要で、 それが両方向に必要だった。実際、どちらの方向でも 複数の鍵が必要で、MAC用の鍵、暗号化用の鍵、IVが必要などなど。 同じようにノンスによる暗号化も複数の鍵を必要とした。などなど。 そこで、問題は私たちがどのように導出した鍵を使うかということだ。 それはハードウェアから生成したものでも、鍵交換で手に入れたものでもよい。 その鍵でたくさんの新しい鍵の束を作成して セッションを安全なものにすることができる。 今行ったのは鍵導出関数 KDF という仕組みで、 もうすこしKDFがどのように構築されるかを話したい。 まず、安全なPRFがあるとして、鍵空間はKとする。 私たちがもっている鍵はSKとする。 SKは鍵空間で一様とする。実際安全なPRFでは、 元となる鍵は一様ランダム鍵だ。 そして、この鍵をセッションを安全にする 鍵の生成にそのまま使える。 この場合、KDFはほんとに単純で、 KDFは次のように働く。 KDFはSK、コンテキストを受け取る。 コンテキストについてはすぐ話す。 そして入力の長さも受け取る。 よし、KDFが何をするかというと、基本的には0についてPDFを評価する。 それから、1について、2について、と行っていき、 Lまで行う。 コンテキストについて話そう。 基本的には セッション。あなたが必要な場合は、方向キーを生成するだろう必要がありますので、あなた 各キーが、暗号化キーおよび mac が含まれます 1 つキーレス方向を知っています。 キー。ので、基本的に必要なビットを生成するし、最後に 出力オフときにセキュリティで保護するには、十分なキーを生成した時にカットを セッション。わかりましたので、これは基本的にを使用してはかなりまっすぐ進むメカニズムです、 セキュリティで保護された PRF は擬似乱数生成器として。唯一の問題は何ですの コンテキスト文字列です。まあ、コンテキスト文字列が基本的には、一意であることよ アプリケーションを識別する文字列。だから実際には、複数を必要があります。 複数のセキュリティで保護されたキーを確立しようとしては、同じシステム上のアプリケーション。 たぶん 1 つのプロセスとしては、あなたを実行する web サーバーがある SSH をある別 プロセス、および 3 番目としての ip アドレスを処理し、すべての 3 つの秘密キーが必要 生成されました。このコンテキスト変数は基本的に 3 つの別々 に それら。だから、私に聞いてより正確に、何これの目的と思う コンテキスト変数ですか?それは離れて、このコンテキスト変数を与えてくれたと思いますのでください。 基本的には別のアプリケーションには、そう、たとえを仮定しました。 例では、我々 だけ 3 つのサービス、SSH、話をサーバー、および IP の設定 Web、 彼らはすべて同じソース キーからハードウェア乱数を取得するが起こる場合 ジェネレーターは、3 つのアプリを異なるのでコンテキスト [になります。 彼らはまだ彼ら [セキュリティで保護することができる 3 つの独立した文字列を得ることを確認して セッション。これは実際にはかなりですが、ことを覚えていて欲しいだけ 簡単なとコンテキスト文字列を実際には前に話し合った 重要なとは、アプリケーションを特定する必要がので、それぞれ アプリケーションでは、独自のセクションのキーを取得します。複数のアプリケーションを場合でも 同じ [聞き取れない] サンプルします。次の質問は、何行う場合ソース キーは実際に均一ではないです。我々 は問題になりました。ソース キーでない場合は、 制服の擬似ランダム関数キーはもはやと仮定することができ、 擬似ランダム関数の出力がランダムから区別されます。実際には場合、 使用するだけですし、出力がランダムに見えるかもしれませんが、先ほど述べた KDF 敵、彼はいくつかのセッション キーが予期することができる可能性があります。 使用し、ことにより、セッションを中断するします。だから、我々 は問題があります。今 なぜこのソース キー制服ないだろうか?多くの理由はなぜこの 起こった。たとえば通常はたまたま、鍵交換プロトコルを使用して キー交換プロトコル高 en-トリッパ [聞き取れない] キーが生成されます。しかし、 高 en-トリッパ [聞き取れない] キーがいくつかの彼の部分に分散するつもりです。 スペース。だからそれか均一な文字列にはないだろう。それはいくつかに統一されます。 サブセット。大規模なのとすぐに我々 の語ることの例を見る キー交換プロトコル。KDFs 種の事実のために対応するので、 キー交換プロトコルは実際に均一ビット文字列を生成しないでください。その他 問題は、実際には、使用しているハードウェア乱数ジェネレーターかもしれないこと、 実際に偏りのある出力を生成します。ハードウェアの非バイアスに依存する必要はありません。 乱数ジェネレーター。だから、すべての我々 と仮定する必要がある高を生成すること エントロピーの文字列が 1 つは、偏りがある場合があります。場合は、私たち必要がなんとかしてあります。 このバイアスをクリーニングします。[サウンド]そして、これは、このパラダイムを紹介します KDFs を構築します。これは、抽出と呼ばれるし、どこの最初のステップのパラダイムを展開 KDF は、実際のソース キーから疑似ランダム キーを抽出することです。そうでは 画像をこのように考えることができます。ある意味でこれらが異なっています。 ソース キーの値。これは、水平線と垂直軸のです。 基本的に、これらの値のそれぞれの確率と見ることができますは、この ソース キーが一様でないことを言うだろうでこぼこ関数の一種です。 キーのスペースで配布。この場合は我々 を使用すると呼ばれるものです、 エクス トラクター。抽出でこぼこの分布を作るものですので それは、鍵空間を均一な分布に。我々 の場合に実際にだけなのです。 計算の抽出器と呼ばれるものを使用しようとしました。すなわち 必ずしもが最後に一様分布を生成しない抽出器 彼らは制服から区別のつかない分布を生成しました。今 エクス トラクターを通常取るとしてと呼ばれるものを塩と塩だけを入力 サラダ、それ種類の味を足すように、それは何基本的のようなものです。 どの入力分布の関係なく、出力は、物事をまぜこぜ 分布はまだランダムから見分けがつかないことになります。だから、塩 基本的には、それは何ですか?それが公に知られているので、非秘密の文字列です。それ doesn't します。 どのような塩、敵を知っている場合は、問題とそれが永久に固定されます。唯一 ポイントは、あなたがそれを選んだときに、ランダム選択ことです。その後、希望は ちょっとから抽出しようとしている面白い分布を本質的にしません。 上に塩を選んだしたがって、結果として、塩を使用によって異なります、 ランダムからと見分けがつきません分布は実際に取得します。だから 塩は本質的に、あなたが知っている、あなただけのカップル キーボード強打することができます。 とき、それがちょうど生成回ランダムで何かをする必要があります。 当初は最後の研究者が何を知っている場合、固定永遠と罰金 それし、それにもかかわらず、抽出、エントロピーと出力を抽出することです、 一様乱数文字列キー。いくつかの塩だけを守るには 敵対の悪い分布が私たちの抽出を混乱可能性があります。わかりました、そう今は 擬似ランダム キーを抽出しました。今、私たちにもちょうどそれを KDF 使用可能性があります。 我々 は安全 [聞き取れない] 関数を使用して、キーを展開する見た 我々 は実際には、セッションを保護する必要がある同じビット数に。わかりましたはそこでください。 これら 2 つの手順。最初の 1 つ私たちは擬似乱数キーをし、1 回の抽出 我々 は我々 として、多くのキーに拡張する方法を既に知っている擬似乱数キーがあります。 我々 は、擬似ランダム関数を使用する必要があります。私たちがやっている、標準化、これです。 kdf 社 H-と呼ばれる。これは、H-MAC から組み込まれている KDF [聞き取れない] リビジョン関数です。 ここで H MAC が拡大 PRF と抽出抽出ツールの両方として使用されます。 初期の擬似キーです。ので、どのようにこの作品を説明させてください。ので、抽出 ステップ、私たちつもりの解決を使用する公共のメンバーを撤回した値だけが起こった ランダム時間の先頭が生成されます。この解決として H MAC を使用して キー。ソース キーは H MAC データとして使用するつもりです。だから我々 のようなものにしています パブリック値をキーとして使用します。それにもかかわらず、1 H Mac を持っていることと主張することができます。 私たちが H Mac を適用した場合などは、抽出のプロパティ結果のキーになります。 一見ランダムなから、実際のソース キーを持つと仮定すると区別がつかない 十分なエントロピーは。今は私たちは擬似ランダム キー私たち単につもりです。 H Mac としての PRF を使用して生成するセッション キーを知って、多くのベースとして我々 セッション キーを必要があります。わかりました。だから基本的には我々 の議論を結論します。 HQDF。か、元のキーを取得した後、覚えてほしいだけ ハードウェアやキー交換プロトコルから、道に換算します。 セッション キーはないそのサンプルを使用して直接です。あなたは決してソース キーを使用しません。 直接プロトコル内のセッション キーとして。だろうと何かを実行、 ソース キー、KDF を介して。KDF のすべてのキーと出力を与えるだろう 使用するランダム キーの偶発性のために必要なお客様 プロトコル。ありを使用する典型的な KDF HKDF は、実際になっている、非常に そこのトラクションのビットです。わかりました。このセグメントで話したい最後のトピック パスワードからキーを抽出する方法。これらパスワード ベースと呼ばれる pdf のまたは pb pdf の。ここでの問題はパスワード比較的低があります。 エントロピー。実際には、私たちの後、コースのパスワードについて話をするつもりだとは ユーザー認証についての話します。あまりここで言うつもりはないので。私はちょうどよ パスワードは、一般的に 20 程度推定非常に少しのエントロピーが言う エントロピーのビットを言います。その結果、ない単に十分なエントロピー パスワードからセッション キーを生成します。まだ我々 はまだ非常にする必要があります。 頻繁に。我々 はまだ暗号化キーと Mac のうち派生する必要 では、どのようにパスワード。最初は、知っている、このためです。 種類の目的は、HKDF を使用しないでください。何それは設計されていません。何をします。 起こる右のキーは実際に何かと呼ばれる脆弱性が存在することです。 私たちずっと後に、コースについて話をするつもりは、辞書攻撃はときに、 我々 はユーザーの認証について話します。だから、この低エントロピーに対する方法 pbkds を守る 辞書攻撃とは結果が問題によって 2 つの手段です。まず、として [聞き取れない] を使用する前に、国民は、ランダムな値の固定永遠に。しかしで さらに、彼らは使用しても何の遅いハッシュ関数と呼ばれます。説明させてください。 パスワードからキーを派生する、標準的なアプローチのような。これは PKCS5 と呼ばれる、 何 PBKDF1 と呼ばれるが、特に、このスクライブのバージョンです。私は このメカニズムはので、最も cryptal ライブラリに実装されていることを言う必要があります。 あなた自身で実装する必要はありません。すべての場合、あなたが知っているだろう、 関数を呼び出すと、あなたは、パスワードから派生キーを知っています。あなたを与えるだろう、 パスワードを入力とあなたとしてのキー出力としてなるでしょう。しかし、あなたが知っておくべき このキーは、実際にはなりますので高エントロピーがあるつもりはないコース デシベル。これらの鉛 KDFs がやろうとして推測の問題としては難しいです。 可能。わかりました。私たちが言ったように、彼らが働く、まず第一に、方法、ので彼ら 基本的にはハッシュは、パスワードと salt の連結。して、ハッシュ 自体は非常に遅いハッシュ関数をように設計されています。低速ハッシュを構築する方法 関数は 1 つの特定のハッシュ関数と言う [聞き取れない] 56 と私たちによってです。 それ多くは、多くの場合、反復処理 C 回。1000 回を想像することができます、おそらくでも、 100万回。そしてそれを反復することで何を意味するか。だから、まあ、私たちを取る、 パスワードは、塩。1 つの入力、ハッシュ関数の内部入れます。 我々 はハッシュ関数適用おっと、それがこのような書き込みさせてください。そして私たち ハッシュ関数を適用し、出力を取得し、我々 ハッシュを適用 関数をもう一度、私たちは、別の出力を取得します。我々 は再び、もう一度、もう一度これを行う たぶん千回は 100万回によってどのように高速あなたのプロセッサか 最後に私たちは実際には、キーとして出力として、最終的な出力を取得します。 このキー導出関数の出力。今ここでのポイントは何でしょうか。反復します。 関数 10,000 回または 100万倍も非常に少し時間を取るつもりです。 現代の CPU と結果として、それは本当に、ユーザーの経験に影響しません。は 彼のパスワードでは、ユーザーの種類は 100万回ハッシュを取得し、出力を取得します。 たぶんそれも取ることができる 2 番目の 10 分の 1 を知っているし、ユーザー wouldn't それに気づきます。しかし、攻撃者が、彼は彼のすべてのパスワードを試すことができます。 我々 は知っているので、辞書では、人々 パスワード辞書で選ぶ傾向がある、 彼が 1 つずつにしようと、思い出して塩を彼は知っているので公開です どのような塩です。彼はちょうど一つずつこのハッシュを試すことができます。しかしのでハッシュ 関数は遅い、各試行が彼が 2 番目の 10 分の 1 を取るつもりです。だから彼は必要がある場合 辞書を介して、ご存知のように、実行すると、2000 億のパスワードには、 ハッシュ関数は低速であるため、これはかなり時間がかかるつもりです。することによって 我々 は辞書攻撃ダウンが遅いし、我々 が、攻撃者には難しく、 私たちのセッション キーを取得します。不可能ではない、ただ困難。すべてこれはしようとしているです。 さて、基本的に何を言ってみたいので、このパスワードは KDFs に基づきます。私として これを自分で構築するない何か。すべての暗号ライブラリがあります。 [聞き取れない] 5 メカニズムの実装。あなただけを呼び出すと、 パスワードをキーに変換し、結果を使用して適切な関数 キー。さて、次のセグメントでは、対称暗号化を使用する方法を参照してください俺たち 方法では、私たちの暗号テキストを検索することができます。