WEBVTT 00:00:00.000 --> 00:00:03.515 さて、対称暗号についてほどんど議論しつくしたが、 00:00:03.515 --> 00:00:06.471 次の話題に移る前に 議論しておきたいちょっとしたものが少しある。 00:00:06.471 --> 00:00:10.431 まず最初に言っておきたいことは、 私たちがどのようにある鍵から小さな鍵をつくっていくかについてだ。 00:00:10.431 --> 00:00:14.497 そしてこの問題は実際にいつもつきまとう問題なんだ。 00:00:14.497 --> 00:00:18.287 だからみんながこの問題にどう正しく対処したらよいか、 明らかにしておきたい。 00:00:18.287 --> 00:00:22.775 どのような設定にしようか? よし、色んな方法で作成されたある元となるキーがあるとしよう。 00:00:22.775 --> 00:00:26.435 そのあるキーはPRGによって作成されたか、 00:00:26.435 --> 00:00:30.094 またはあとで話す鍵交換プロトコルというものから作成されたとする。 00:00:30.094 --> 00:00:34.036 まあいずれにせよ、 00:00:34.036 --> 00:00:38.110 アリスとボブの間で作成されるキーの作り方はたくさんある。 00:00:38.110 --> 00:00:42.569 攻撃者に知られていない鍵がね。 さて、言ったようにさまざまな場合で、 00:00:42.569 --> 00:00:46.863 セッションを安全なものにするためには実際あるひとつの鍵ではなく、 たくさんの鍵が必要なんだが、 00:00:46.863 --> 00:00:51.267 たとえば、もし覚えているなら、TLSは1方向の鍵が必要で、 00:00:51.267 --> 00:00:55.285 それが両方向に必要だった。実際、どちらの方向でも 00:00:55.285 --> 00:00:59.469 複数の鍵が必要で、MAC用の鍵、暗号化用の鍵、IVが必要などなど。 00:00:59.469 --> 00:01:03.093 同じようにノンスによる暗号化も複数の鍵を必要とした。などなど。 00:01:03.093 --> 00:01:07.594 そこで、問題は私たちがどのように導出した鍵を使うかということだ。 00:01:07.594 --> 00:01:12.031 それはハードウェアから生成したものでも、鍵交換で手に入れたものでもよい。 00:01:12.031 --> 00:01:16.351 その鍵でたくさんの新しい鍵の束を作成して 00:01:16.351 --> 00:01:20.531 セッションを安全なものにすることができる。 今行ったのは鍵導出関数 KDF という仕組みで、 00:01:20.531 --> 00:01:24.951 もうすこしKDFがどのように構築されるかを話したい。 00:01:24.951 --> 00:01:29.846 まず、安全なPRFがあるとして、鍵空間はKとする。 00:01:29.846 --> 00:01:34.993 私たちがもっている鍵はSKとする。 00:01:34.993 --> 00:01:41.207 SKは鍵空間で一様とする。実際安全なPRFでは、 元となる鍵は一様ランダム鍵だ。 00:01:41.207 --> 00:01:46.453 そして、この鍵をセッションを安全にする 鍵の生成にそのまま使える。 00:01:46.453 --> 00:01:50.444 この場合、KDFはほんとに単純で、 00:01:50.444 --> 00:01:53.771 KDFは次のように働く。 00:01:53.771 --> 00:01:58.025 KDFはSK、コンテキストを受け取る。 コンテキストについてはすぐ話す。 00:01:58.025 --> 00:02:02.766 そして入力の長さも受け取る。 00:02:02.766 --> 00:02:07.615 よし、KDFが何をするかというと、基本的には0についてPDFを評価する。 00:02:07.615 --> 00:02:12.400 それから、1について、2について、と行っていき、 Lまで行う。 00:02:12.400 --> 00:02:16.449 コンテキストについて話そう。 00:02:16.449 --> 00:02:20.353 基本的には 00:02:20.353 --> 00:02:24.256 セッション。あなたが必要な場合は、方向キーを生成するだろう必要がありますので、あなた 00:02:24.256 --> 00:02:28.355 各キーが、暗号化キーおよび mac が含まれます 1 つキーレス方向を知っています。 00:02:28.355 --> 00:02:32.356 キー。ので、基本的に必要なビットを生成するし、最後に 00:02:32.356 --> 00:02:36.259 出力オフときにセキュリティで保護するには、十分なキーを生成した時にカットを 00:02:36.259 --> 00:02:41.177 セッション。わかりましたので、これは基本的にを使用してはかなりまっすぐ進むメカニズムです、 00:02:41.177 --> 00:02:45.656 セキュリティで保護された PRF は擬似乱数生成器として。唯一の問題は何ですの 00:02:45.656 --> 00:02:49.451 コンテキスト文字列です。まあ、コンテキスト文字列が基本的には、一意であることよ 00:02:49.451 --> 00:02:53.545 アプリケーションを識別する文字列。だから実際には、複数を必要があります。 00:02:53.545 --> 00:02:58.304 複数のセキュリティで保護されたキーを確立しようとしては、同じシステム上のアプリケーション。 00:02:58.304 --> 00:03:03.169 たぶん 1 つのプロセスとしては、あなたを実行する web サーバーがある SSH をある別 00:03:03.169 --> 00:03:09.145 プロセス、および 3 番目としての ip アドレスを処理し、すべての 3 つの秘密キーが必要 00:03:09.145 --> 00:03:13.533 生成されました。このコンテキスト変数は基本的に 3 つの別々 に 00:03:13.533 --> 00:03:16.589 それら。だから、私に聞いてより正確に、何これの目的と思う 00:03:19.204 --> 00:03:22.312 コンテキスト変数ですか?それは離れて、このコンテキスト変数を与えてくれたと思いますのでください。 00:03:22.312 --> 00:03:26.166 基本的には別のアプリケーションには、そう、たとえを仮定しました。 00:03:26.166 --> 00:03:30.863 例では、我々 だけ 3 つのサービス、SSH、話をサーバー、および IP の設定 Web、 00:03:30.863 --> 00:03:35.741 彼らはすべて同じソース キーからハードウェア乱数を取得するが起こる場合 00:03:35.741 --> 00:03:40.378 ジェネレーターは、3 つのアプリを異なるのでコンテキスト [になります。 00:03:40.378 --> 00:03:45.617 彼らはまだ彼ら [セキュリティで保護することができる 3 つの独立した文字列を得ることを確認して 00:03:45.617 --> 00:03:49.873 セッション。これは実際にはかなりですが、ことを覚えていて欲しいだけ 00:03:49.873 --> 00:03:53.648 簡単なとコンテキスト文字列を実際には前に話し合った 00:03:53.648 --> 00:03:57.374 重要なとは、アプリケーションを特定する必要がので、それぞれ 00:03:57.374 --> 00:04:01.300 アプリケーションでは、独自のセクションのキーを取得します。複数のアプリケーションを場合でも 00:04:01.300 --> 00:04:05.139 同じ [聞き取れない] サンプルします。次の質問は、何行う場合ソース 00:04:05.139 --> 00:04:09.714 キーは実際に均一ではないです。我々 は問題になりました。ソース キーでない場合は、 00:04:09.714 --> 00:04:14.113 制服の擬似ランダム関数キーはもはやと仮定することができ、 00:04:14.113 --> 00:04:18.511 擬似ランダム関数の出力がランダムから区別されます。実際には場合、 00:04:18.511 --> 00:04:23.841 使用するだけですし、出力がランダムに見えるかもしれませんが、先ほど述べた KDF 00:04:23.841 --> 00:04:27.416 敵、彼はいくつかのセッション キーが予期することができる可能性があります。 00:04:27.416 --> 00:04:31.562 使用し、ことにより、セッションを中断するします。だから、我々 は問題があります。今 00:04:31.562 --> 00:04:35.510 なぜこのソース キー制服ないだろうか?多くの理由はなぜこの 00:04:35.510 --> 00:04:39.560 起こった。たとえば通常はたまたま、鍵交換プロトコルを使用して 00:04:39.560 --> 00:04:42.826 キー交換プロトコル高 en-トリッパ [聞き取れない] キーが生成されます。しかし、 00:04:42.826 --> 00:04:46.774 高 en-トリッパ [聞き取れない] キーがいくつかの彼の部分に分散するつもりです。 00:04:46.774 --> 00:04:51.455 スペース。だからそれか均一な文字列にはないだろう。それはいくつかに統一されます。 00:04:51.455 --> 00:04:55.763 サブセット。大規模なのとすぐに我々 の語ることの例を見る 00:04:55.926 --> 00:05:00.317 キー交換プロトコル。KDFs 種の事実のために対応するので、 00:05:00.317 --> 00:05:04.492 キー交換プロトコルは実際に均一ビット文字列を生成しないでください。その他 00:05:04.492 --> 00:05:08.830 問題は、実際には、使用しているハードウェア乱数ジェネレーターかもしれないこと、 00:05:08.830 --> 00:05:13.384 実際に偏りのある出力を生成します。ハードウェアの非バイアスに依存する必要はありません。 00:05:13.384 --> 00:05:17.252 乱数ジェネレーター。だから、すべての我々 と仮定する必要がある高を生成すること 00:05:17.252 --> 00:05:21.842 エントロピーの文字列が 1 つは、偏りがある場合があります。場合は、私たち必要がなんとかしてあります。 00:05:21.842 --> 00:05:26.735 このバイアスをクリーニングします。[サウンド]そして、これは、このパラダイムを紹介します 00:05:26.735 --> 00:05:31.962 KDFs を構築します。これは、抽出と呼ばれるし、どこの最初のステップのパラダイムを展開 00:05:31.962 --> 00:05:37.247 KDF は、実際のソース キーから疑似ランダム キーを抽出することです。そうでは 00:05:37.247 --> 00:05:40.829 画像をこのように考えることができます。ある意味でこれらが異なっています。 00:05:40.829 --> 00:05:45.343 ソース キーの値。これは、水平線と垂直軸のです。 00:05:45.343 --> 00:05:49.541 基本的に、これらの値のそれぞれの確率と見ることができますは、この 00:05:49.541 --> 00:05:53.464 ソース キーが一様でないことを言うだろうでこぼこ関数の一種です。 00:05:53.464 --> 00:05:58.561 キーのスペースで配布。この場合は我々 を使用すると呼ばれるものです、 00:05:58.561 --> 00:06:02.913 エクス トラクター。抽出でこぼこの分布を作るものですので 00:06:02.913 --> 00:06:07.462 それは、鍵空間を均一な分布に。我々 の場合に実際にだけなのです。 00:06:07.462 --> 00:06:10.027 計算の抽出器と呼ばれるものを使用しようとしました。すなわち 00:06:10.027 --> 00:06:14.894 必ずしもが最後に一様分布を生成しない抽出器 00:06:14.894 --> 00:06:20.257 彼らは制服から区別のつかない分布を生成しました。今 00:06:22.910 --> 00:06:27.323 エクス トラクターを通常取るとしてと呼ばれるものを塩と塩だけを入力 00:06:27.323 --> 00:06:31.318 サラダ、それ種類の味を足すように、それは何基本的のようなものです。 00:06:31.318 --> 00:06:36.022 どの入力分布の関係なく、出力は、物事をまぜこぜ 00:06:36.022 --> 00:06:39.738 分布はまだランダムから見分けがつかないことになります。だから、塩 00:06:39.738 --> 00:06:43.973 基本的には、それは何ですか?それが公に知られているので、非秘密の文字列です。それ doesn't します。 00:06:43.973 --> 00:06:48.565 どのような塩、敵を知っている場合は、問題とそれが永久に固定されます。唯一 00:06:48.565 --> 00:06:53.096 ポイントは、あなたがそれを選んだときに、ランダム選択ことです。その後、希望は 00:06:53.096 --> 00:06:57.173 ちょっとから抽出しようとしている面白い分布を本質的にしません。 00:06:57.173 --> 00:07:00.274 上に塩を選んだしたがって、結果として、塩を使用によって異なります、 00:07:00.274 --> 00:07:03.729 ランダムからと見分けがつきません分布は実際に取得します。だから 00:07:03.729 --> 00:07:07.020 塩は本質的に、あなたが知っている、あなただけのカップル キーボード強打することができます。 00:07:07.020 --> 00:07:10.220 とき、それがちょうど生成回ランダムで何かをする必要があります。 00:07:10.220 --> 00:07:14.249 当初は最後の研究者が何を知っている場合、固定永遠と罰金 00:07:14.249 --> 00:07:20.304 それし、それにもかかわらず、抽出、エントロピーと出力を抽出することです、 00:07:20.304 --> 00:07:24.713 一様乱数文字列キー。いくつかの塩だけを守るには 00:07:24.713 --> 00:07:29.667 敵対の悪い分布が私たちの抽出を混乱可能性があります。わかりました、そう今は 00:07:29.667 --> 00:07:34.581 擬似ランダム キーを抽出しました。今、私たちにもちょうどそれを KDF 使用可能性があります。 00:07:34.581 --> 00:07:38.911 我々 は安全 [聞き取れない] 関数を使用して、キーを展開する見た 00:07:38.911 --> 00:07:43.481 我々 は実際には、セッションを保護する必要がある同じビット数に。わかりましたはそこでください。 00:07:43.481 --> 00:07:47.431 これら 2 つの手順。最初の 1 つ私たちは擬似乱数キーをし、1 回の抽出 00:07:47.431 --> 00:07:51.584 我々 は我々 として、多くのキーに拡張する方法を既に知っている擬似乱数キーがあります。 00:07:51.584 --> 00:07:56.033 我々 は、擬似ランダム関数を使用する必要があります。私たちがやっている、標準化、これです。 00:07:56.033 --> 00:08:01.170 kdf 社 H-と呼ばれる。これは、H-MAC から組み込まれている KDF [聞き取れない] リビジョン関数です。 00:08:01.170 --> 00:08:06.561 ここで H MAC が拡大 PRF と抽出抽出ツールの両方として使用されます。 00:08:06.561 --> 00:08:11.699 初期の擬似キーです。ので、どのようにこの作品を説明させてください。ので、抽出 00:08:11.699 --> 00:08:16.900 ステップ、私たちつもりの解決を使用する公共のメンバーを撤回した値だけが起こった 00:08:16.900 --> 00:08:21.101 ランダム時間の先頭が生成されます。この解決として H MAC を使用して 00:08:21.101 --> 00:08:27.526 キー。ソース キーは H MAC データとして使用するつもりです。だから我々 のようなものにしています 00:08:27.526 --> 00:08:32.292 パブリック値をキーとして使用します。それにもかかわらず、1 H Mac を持っていることと主張することができます。 00:08:32.292 --> 00:08:37.623 私たちが H Mac を適用した場合などは、抽出のプロパティ結果のキーになります。 00:08:37.623 --> 00:08:42.452 一見ランダムなから、実際のソース キーを持つと仮定すると区別がつかない 00:08:42.452 --> 00:08:47.329 十分なエントロピーは。今は私たちは擬似ランダム キー私たち単につもりです。 00:08:47.329 --> 00:08:52.037 H Mac としての PRF を使用して生成するセッション キーを知って、多くのベースとして我々 00:08:52.037 --> 00:08:56.389 セッション キーを必要があります。わかりました。だから基本的には我々 の議論を結論します。 00:08:56.389 --> 00:09:00.763 HQDF。か、元のキーを取得した後、覚えてほしいだけ 00:09:00.763 --> 00:09:04.912 ハードウェアやキー交換プロトコルから、道に換算します。 00:09:04.912 --> 00:09:09.566 セッション キーはないそのサンプルを使用して直接です。あなたは決してソース キーを使用しません。 00:09:09.566 --> 00:09:14.108 直接プロトコル内のセッション キーとして。だろうと何かを実行、 00:09:14.108 --> 00:09:18.369 ソース キー、KDF を介して。KDF のすべてのキーと出力を与えるだろう 00:09:18.369 --> 00:09:22.575 使用するランダム キーの偶発性のために必要なお客様 00:09:22.575 --> 00:09:27.042 プロトコル。ありを使用する典型的な KDF HKDF は、実際になっている、非常に 00:09:27.042 --> 00:09:31.952 そこのトラクションのビットです。わかりました。このセグメントで話したい最後のトピック 00:09:31.952 --> 00:09:36.430 パスワードからキーを抽出する方法。これらパスワード ベースと呼ばれる 00:09:36.430 --> 00:09:41.921 pdf のまたは pb pdf の。ここでの問題はパスワード比較的低があります。 00:09:41.921 --> 00:09:45.764 エントロピー。実際には、私たちの後、コースのパスワードについて話をするつもりだとは 00:09:45.764 --> 00:09:50.154 ユーザー認証についての話します。あまりここで言うつもりはないので。私はちょうどよ 00:09:50.154 --> 00:09:54.291 パスワードは、一般的に 20 程度推定非常に少しのエントロピーが言う 00:09:54.291 --> 00:09:59.010 エントロピーのビットを言います。その結果、ない単に十分なエントロピー 00:09:59.010 --> 00:10:02.882 パスワードからセッション キーを生成します。まだ我々 はまだ非常にする必要があります。 00:10:02.882 --> 00:10:06.804 頻繁に。我々 はまだ暗号化キーと Mac のうち派生する必要 00:10:06.804 --> 00:10:10.828 では、どのようにパスワード。最初は、知っている、このためです。 00:10:10.828 --> 00:10:14.744 種類の目的は、HKDF を使用しないでください。何それは設計されていません。何をします。 00:10:14.744 --> 00:10:18.657 起こる右のキーは実際に何かと呼ばれる脆弱性が存在することです。 00:10:18.657 --> 00:10:22.105 私たちずっと後に、コースについて話をするつもりは、辞書攻撃はときに、 00:10:22.105 --> 00:10:27.787 我々 はユーザーの認証について話します。だから、この低エントロピーに対する方法 pbkds を守る 00:10:27.787 --> 00:10:33.002 辞書攻撃とは結果が問題によって 2 つの手段です。まず、として 00:10:33.002 --> 00:10:38.878 [聞き取れない] を使用する前に、国民は、ランダムな値の固定永遠に。しかしで 00:10:38.878 --> 00:10:43.097 さらに、彼らは使用しても何の遅いハッシュ関数と呼ばれます。説明させてください。 00:10:43.097 --> 00:10:49.355 パスワードからキーを派生する、標準的なアプローチのような。これは PKCS5 と呼ばれる、 00:10:49.355 --> 00:10:53.911 何 PBKDF1 と呼ばれるが、特に、このスクライブのバージョンです。私は 00:10:53.911 --> 00:10:57.398 このメカニズムはので、最も cryptal ライブラリに実装されていることを言う必要があります。 00:10:57.398 --> 00:11:00.663 あなた自身で実装する必要はありません。すべての場合、あなたが知っているだろう、 00:11:00.663 --> 00:11:03.788 関数を呼び出すと、あなたは、パスワードから派生キーを知っています。あなたを与えるだろう、 00:11:03.788 --> 00:11:08.353 パスワードを入力とあなたとしてのキー出力としてなるでしょう。しかし、あなたが知っておくべき 00:11:08.353 --> 00:11:11.741 このキーは、実際にはなりますので高エントロピーがあるつもりはないコース 00:11:11.741 --> 00:11:17.155 デシベル。これらの鉛 KDFs がやろうとして推測の問題としては難しいです。 00:11:17.155 --> 00:11:20.964 可能。わかりました。私たちが言ったように、彼らが働く、まず第一に、方法、ので彼ら 00:11:20.964 --> 00:11:25.693 基本的にはハッシュは、パスワードと salt の連結。して、ハッシュ 00:11:25.693 --> 00:11:29.170 自体は非常に遅いハッシュ関数をように設計されています。低速ハッシュを構築する方法 00:11:29.170 --> 00:11:34.063 関数は 1 つの特定のハッシュ関数と言う [聞き取れない] 56 と私たちによってです。 00:11:34.063 --> 00:11:39.425 それ多くは、多くの場合、反復処理 C 回。1000 回を想像することができます、おそらくでも、 00:11:39.425 --> 00:11:43.356 100万回。そしてそれを反復することで何を意味するか。だから、まあ、私たちを取る、 00:11:43.356 --> 00:11:48.494 パスワードは、塩。1 つの入力、ハッシュ関数の内部入れます。 00:11:48.494 --> 00:11:54.025 我々 はハッシュ関数適用おっと、それがこのような書き込みさせてください。そして私たち 00:11:54.025 --> 00:11:57.779 ハッシュ関数を適用し、出力を取得し、我々 ハッシュを適用 00:11:57.779 --> 00:12:00.779 関数をもう一度、私たちは、別の出力を取得します。我々 は再び、もう一度、もう一度これを行う 00:12:00.779 --> 00:12:05.830 たぶん千回は 100万回によってどのように高速あなたのプロセッサか 00:12:05.830 --> 00:12:10.710 最後に私たちは実際には、キーとして出力として、最終的な出力を取得します。 00:12:10.710 --> 00:12:15.057 このキー導出関数の出力。今ここでのポイントは何でしょうか。反復します。 00:12:15.057 --> 00:12:19.371 関数 10,000 回または 100万倍も非常に少し時間を取るつもりです。 00:12:19.371 --> 00:12:22.922 現代の CPU と結果として、それは本当に、ユーザーの経験に影響しません。は 00:12:22.922 --> 00:12:27.792 彼のパスワードでは、ユーザーの種類は 100万回ハッシュを取得し、出力を取得します。 00:12:27.792 --> 00:12:31.654 たぶんそれも取ることができる 2 番目の 10 分の 1 を知っているし、ユーザー wouldn't 00:12:31.654 --> 00:12:35.489 それに気づきます。しかし、攻撃者が、彼は彼のすべてのパスワードを試すことができます。 00:12:35.489 --> 00:12:39.689 我々 は知っているので、辞書では、人々 パスワード辞書で選ぶ傾向がある、 00:12:39.689 --> 00:12:43.780 彼が 1 つずつにしようと、思い出して塩を彼は知っているので公開です 00:12:43.780 --> 00:12:49.232 どのような塩です。彼はちょうど一つずつこのハッシュを試すことができます。しかしのでハッシュ 00:12:49.232 --> 00:12:53.796 関数は遅い、各試行が彼が 2 番目の 10 分の 1 を取るつもりです。だから彼は必要がある場合 00:12:53.796 --> 00:12:57.965 辞書を介して、ご存知のように、実行すると、2000 億のパスワードには、 00:12:57.965 --> 00:13:02.416 ハッシュ関数は低速であるため、これはかなり時間がかかるつもりです。することによって 00:13:02.416 --> 00:13:06.584 我々 は辞書攻撃ダウンが遅いし、我々 が、攻撃者には難しく、 00:13:06.584 --> 00:13:11.608 私たちのセッション キーを取得します。不可能ではない、ただ困難。すべてこれはしようとしているです。 00:13:11.608 --> 00:13:15.748 さて、基本的に何を言ってみたいので、このパスワードは KDFs に基づきます。私として 00:13:15.748 --> 00:13:19.835 これを自分で構築するない何か。すべての暗号ライブラリがあります。 00:13:19.835 --> 00:13:23.976 [聞き取れない] 5 メカニズムの実装。あなただけを呼び出すと、 00:13:23.976 --> 00:13:28.275 パスワードをキーに変換し、結果を使用して適切な関数 00:13:28.275 --> 00:13:32.362 キー。さて、次のセグメントでは、対称暗号化を使用する方法を参照してください俺たち 00:13:32.362 --> 00:13:35.229 方法では、私たちの暗号テキストを検索することができます。