ここでは、アルゴリズムを選定する時に必要な「隠すセキュリティ」という概念について紹介します。
以下、2人の会話をご覧ください。
![]() |
せんぱ~い (^ー^) |
![]() |
ん? うおっ!? |
![]() |
頭がやわらかくなりましたよ~! すごいでしょ? |
![]() |
こ、これはすごいな! どうやったらそうなるんだ? |
![]() |
ちょっとしたコツがあるんですよ。 |
![]() |
そ、そうなんだ、、、 で、それは元に戻るのか? |
![]() |
簡単ですよ、ほら。 あ、あれっ? |
![]() |
ん、どうした? |
![]() |
いや、ちょっと待って、、、 すぐに戻りますから。 |
![]() |
あ、そう? なんか、余計にやわらかくなってないか? |
![]() |
よいしょっ! ふぉっ! |
![]() |
なんか、大変そうだな。 手伝おうか? |
![]() |
はうっ! せんぱい、助けて~! |
![]() |
助けようにも、どうすればいいんだか、、、? こうかな? |
![]() |
うひょっ! |
![]() |
こうか? |
![]() |
うひょひょっ! |
![]() |
おっ、けっこう直ったよ? とりあえず、これでいいんじゃないか? |
![]() |
、、、おかしくないですか? |
![]() |
いや、おかしくないと言えばウソになるけど。 そのうち、自然に直るんじゃねーの? |
![]() |
しょ、しょんな、、、 |
![]() |
あ、でも少しずつ戻ってきたよ? 本当に、しばらく待てば戻るんじゃない? |
![]() |
あ、そうですか? じゃ、少し様子を見てみます。 |
![]() |
外見は柔らかそうだけど、肝心の中身は大丈夫? |
![]() |
はい、だいじょぶです。 教えてください、「隠すセキュリティ」とやらを。 |
![]() |
よし、じゃいくか。 ハッシュの話で、MD5とかSHAというのが出てきたよね? |
![]() |
はい、よく使われているハッシュアルゴリズムの種類ですよね。 |
![]() |
そう。 で、みんながこのアルゴリズムを使うのは何でだと思う? |
![]() |
理由ですか? 単純に、優れてるからだと思いますよ? |
![]() |
うん、そうだね。 じゃあ言い方を変えて、仕様が公開されてるアルゴリズムを使う理由は何だろう? |
![]() |
あ~、、 確かに不思議なんですよね~。 |
![]() |
普通に考えたら、第三者が知らない仕組みを使ったほうが安全な気がしない? |
![]() |
そうなんですよ。 秘密にしておけば、仕組みを解析させる時間を稼ぐことが出来ますよね。 |
![]() |
そのとおり。 でも、一見して正しく見えるこの考え方は、広い視点で見ると必ずしも正しくないんだよ~。 |
![]() |
うーん、そうなんですか。 今回のテーマは、今まで以上に奥が深そうですね! |
![]() |
例えば、アルゴリズムを自分で作ったとしよう。 製作者になりきってみそ。 |
![]() |
あ、私ですか? はい、私が製作者です。 |
![]() |
じゃあ、こっちは依頼者になりきって、、、 「あ~、このアルゴリズムは、きちんと改竄を正確に検出できるのかね?」 |
![]() |
「はい、そのように作りました。」 |
![]() |
「あ~、アルゴリズムを破る方法はないのかね?」 |
![]() |
「はい、理論上は出来ないはずです。」 |
![]() |
とまあ、こんな感じのやり取りがありそうだけど、この製作者の言っていることを誰が証明できるだろうか? |
![]() |
そうですねぇ~、、、 本当は製作者にやってほしいですけど、一般的に製作者自身は問題点に気付いていませんから、結果的には適任者がいませんね。 |
![]() |
そう、よく分かったね! 本人が問題点に気付いていたら、とっくに本人が直しているはずだからね。 |
![]() |
同感です。 それに、そもそもそんなことを証明する手段もないんじゃないですかねぇ? |
![]() |
最初に決めた仕様のとおりに出来上がっていることを確認することは出来るけど、最初の仕様が絶対に堅牢であることを確認する手段はなさそうだね。 |
![]() |
インターネットは全世界が相手ですから、仕様の不備に気付く人が世界に一人ぐらいいてもおかしくないと思います。 もちろん、世界中の人に狙われているわけじゃないですけど、分母が大きいのは間違いないですから。 |
![]() |
そうなると、「絶対に大丈夫」と言ってくれる人や手段は存在しないことになり、少しでも大丈夫な状態に近づける努力をするしかない。 一体どうしたらいいだろうか? |
![]() |
いや、これは難しいですよ~。 でも、どっちにしても自分だけで粘って解決できることじゃなさそうですから、やっぱり誰かに見てもらうしかないんじゃ、、、? |
![]() |
きっと、それしかないだろうね。 それも、それなりに詳しい人じゃないとダメだろう。 |
![]() |
いや~、でも、そんな都合のいい知り合いなんているわけないですよ。 しかも、タダでやってくれるハズもないし。 |
![]() |
そうだろうね。 そうなると、残る手段は限られてくるだろう。 |
![]() |
あ~、もしかして! 仕様を公開しているのって、色々な人にダメ出しをやってもらうためだったんじゃ? |
![]() |
まぁ、ダメ出しは大げさだけど、、 要するに、みんなが使って問題が出なかったとか、数学者が解読を試みて成功しなかったとか、外に晒すことで現実ベースでの根拠が生まれやすくなるんだよ。 |
![]() |
なるへそ~! でも、大勢の人に使ってもらうには知名度が必要ですね。 |
![]() |
いま一般に使用されているアルゴリズムの多くは、競合に勝ち残って政府機関などに正式採用されたり、古くから広く利用されてデファクトスタンダードになったものばかりなんだよ。 |
![]() |
はー、、、 やっぱり、優秀なアルゴリズムが生き残っていくんですね~。 |
![]() |
色々な環境に揉まれたアルゴリズムは、きっと洗練されているはずだよ。 そう考えると、自分ごときが作ったアルゴリズムが堅牢だなんていうのは、おこがましいと思うだろう? |
![]() |
まったくその通りですワ。 「絶対に大丈夫」というセリフを吐くということは、世界中のクラッカーやハッカーに喧嘩を売ることに等しいですからね。 |
![]() |
喧嘩は大げさだけど、まぁそんなところだ。 わざわざ仕様を公開する理由は分かってもらえたかな? |
![]() |
はい、見せるほうが安全という考え方は少し意外でしたが、よく分かりました。 でも、、、 |
![]() |
ん? |
![]() |
やっぱり、仕様を隠して解析に時間を掛けさせる効果も捨てがたいと思いますけど、どうなんでしょう? 少しぐらい問題があるアルゴリズムでも、仕組みが隠蔽されていれば大丈夫なんじゃないかと。 |
![]() |
さぁ、そこだ! まさに、「隠すセキュリティ」の根幹がそこにある。 |
![]() |
えっ、どこですか? |
![]() |
不備があるかもしれない仕組みでも中身が隠されていれば大丈夫、っていうところ。 言い換えると、隠すことをセキュリティ維持の前提にしているところ。 |
![]() |
はぁ、、、 まだ、ピンと来ないです。。。 |
![]() |
逆に言うと、仕組みがバレた時点でそのシステムのセキュリティレベルがガタ落ち、あるいは破綻してしまう。 |
![]() |
そっか、隠すことでセキュリティを維持しているから「隠すセキュリティ」ですか。 でも、バレなければいいという意味では、パスワードなんかと同じイメージじゃないんですか? |
![]() |
いや、ぜんぜん違うぞ。 それぞれで秘密がバレた場合のインパクトを考えてみそ? |
![]() |
パスワードを盗まれたら、普通はパスワードを再設定しますよね? 隠していた仕組みがバレたら、、えっと、、、 |
![]() |
バレたら? |
![]() |
あれっ? もしかして、その仕組みを使っているシステムを丸ごと取り替えないとダメ? |
![]() |
代わりの仕組みがあるか、もっと良い仕組みに修復する方法があればの話だけど、きっとそうなるだろうね。 |
![]() |
確かに、インパクトが全く違いますね。 |
![]() |
パスワードがバレた場合は、パスワードで認証する仕組みそのものが問題なわけじゃないから、パスワードを変えるだけで解決する。 仕組みがバレた場合は、仮にシステムの入れ替えが楽だったとしても、そんな簡単に替えの仕組みは用意できないだろうから大変には違いない。 |
![]() |
う~ん、なっとく。 じゃ、最後にもうひとつ抵抗させてください。 |
![]() |
おう、ドンと来い! |
![]() |
ぶっちゃけバレなきゃいいんですから、仕組みを隠し続ければ大丈夫ですよね? |
![]() |
いや、データ交換には相手がいるわけだから、相手には仕組みを教えるか、それを実装したコードなどを渡す必要があるだろう? かなり閉じた世界で使うなら大丈夫かもしれないけど、相手に渡ったコードがひとつ残らず秘密にされる確率は高くないと思うよ? |
![]() |
そっか、、、 全ての相手が秘密を守ってくれるとは限らないし、どれかひとつでも漏れたらダメなんですね。 |
![]() |
最初から仕組みが公開されていれば、わざわざ相手に教える必要もないし、相手との互換性も高まるはずだ。 トータルで考えると、「隠すセキュリティ」の問題点と、公開することのメリットが見えてくるだろう? |
![]() |
うーん、なかなか深い話ですね。 「隠すセキュリティ」の意味が、やっと分かってきました。 |
![]() |
あと、色々な立場の人たちに見せることで、特定の人たちの利権や商売っ気を出させないという効果もあるよ。 |
![]() |
あ~、それは言えてますね。 変なシガラミがあると、純粋に真理を追究できませんから。 |
![]() |
おっ、大人な意見だね! しがらみの話もあるけど、製作者がアルゴリズムの中にコッソリ抜け穴を作る可能性もなくなるよね。 |
![]() |
そんなものを故意に入れたら、自分の名前に傷が付くから、絶対やんないでしょうね。 |
![]() |
これらのメリットは、どんなに優れた技術を持っている組織でも、仕様を隠蔽している限りは絶対に得られないものだ。 しかしその一方で、「仕組みが分かっているのに解けない」という難解なテーマに取り組まないといけない。 |
![]() |
あれっ? 今まで気付きませんでしたけど、、、 |
![]() |
ん? |
![]() |
そういえば、仕様を公開すると、確かに「仕組みが分かっているのに解けない」方法じゃないとダメですよね。 そんな方法って、簡単に見つかるものなんですか? |
![]() |
ある意味、それを見つけることがアルゴリズムの堅牢さに繋がっているんだよ。 簡単な解き方を誰かに発見された時点で、そのアルゴリズムはオシマイということ。 |
![]() |
は~、、、 専門家同士の闘いですね。 |
![]() |
解き方が見つからなくても、総当たり攻撃に耐えられなければ同じことだ。 |
![]() |
総当たり攻撃って、バカみたいに全てのパターンを試す、っていうやつですよね。 その代わり、単純なだけにどんなアルゴリズムにも有効な手段ですけど。 |
![]() |
総当たり攻撃への耐性は、たとえば鍵の長さのように、解の空間を拡げられるようにしておけば対処できるよ。 ただし、「バカみたいじゃない手法」を編み出して効率よく解読されてしまったら、その分だけ解の空間を狭められてしまうので、解読されたも同然になってしまう場合もある。 |
![]() |
は~、、、 そこまでいくと、もう作った本人も気付かないんじゃないでしょうか? |
![]() |
まぁ、そうだろうね。 学者や善良なハッカーが見つけてくれれば、悪用されないうちに手法が公開されて対処されるんだろうけど。 |
![]() |
? 「善良なハッカー」って、何ですか? |
![]() |
えっ? |
![]() |
ハッカーって、ふつう悪質じゃないんですか? |
![]() |
あぁ、そのことか。 それは後で、、、っていうか、かなり深い話を一気に出してしまったけど、今までの内容は理解できた? |
![]() |
なんか、かなり集中して聞いていたので、すっかり時間が経つのを忘れてました。 でも、分かりやすく説明してもらったおかげで、けっこう理解できましたよ! |
![]() |
そうか。 あまり詰め込みすぎるのもアレだし、今日はこれくらいにしておこうか? |
![]() |
なんか、あまりにインパクトのある話ばっかりだったので、人生観が変わってしまいそうです。 今日は布団に入った瞬間に、妄想の世界へ誘われてしまいそう。 |
![]() |
そんな、大げさな、、、 そんなことより、やわらか頭が直ってないぞ! |
![]() |
えっ!? マ、マジすか? |
![]() |
ウソぴょーん! よかったね、ちゃんと戻ってるよ。 |
![]() |
なんだ、よかった~。 せんぱいって、意外とおちゃめさん? |
以下、「ハッカーとクラッカーについて」につづく。。。
ネットワークセキュリティ関係者の部屋 > ネットワークセキュリティ実践劇場 > 「隠すセキュリティ」について