公開鍵をテーマに学ぶ「ハッカーの真髄と心構え」〜Qiita Conference 2022イベントレポート
2022年6月23~24日、エンジニアとして活動している方を対象にしたオンラインイベント「Qiita Conference 2022」が開催されました。こちらは、“ソフトウェア開発に関わる人々の、新たなきっかけを創出する”をコンセプトとした、Qiitaが主催したものとなります。
プログラムを書く人なら、「ハッカー」という言葉の響きに憧れたことがあるかもしれません。「ハッカーの本質は、ものごとの裏側に気を配れる人のことだ」という持論を語るのは、株式会社ゆめみのマルチスタックエンジニアであり、取締役を務めるスミス祐一郎ルーク氏です。「Qiita Conference」では、「ハッカー入門:公開鍵で学ぶ、ものごとの裏側を考える技術」と題して、公開鍵の中身を徹底解剖することで「ハッカー」とは何かの一端を共有しました。今回はその模様をダイジェストでお伝えします。
※本レポートでは、当日のセッショントーク内容の中からポイントとなる部分等を抽出して再編集しています。
登壇者情報
目次
ハッカーに求められるものは考え方か技術か
「ハッカー」という言葉を聞いて、何を思い浮かべるでしょうか。「ダーク」「パソコンに詳しい」など、人によっていろんなイメージがあるでしょう。
では、定義としてはどう説明されているのでしょうか。ルーク氏がときどき見返しているサイト「How To Become A Hacker」を見てみます。
このサイトには、「ハッカーとしての心構え」が5つ示されています。
- この世界は解決を待っている魅力的な問題でいっぱいだ
- 同じ問題を二度解くような無駄はいやだ
- 退屈と単純作業は悪
- 自由は善
- 心構えは技能の代用にはならない
5つの心構えのうち技術について触れているものは、最後の「心構えは技能の代用にはならない」だけです。本人の考え方や精神がいくらハッカーに向いていても、肝心な技術力がなければ説得力がないということでしょう。
ルーク氏は「心構えよりも技術が優先される、とはっきり書かれているのが興味深いですね。結局のところ、技術を突き詰めていくことがハッカーなのだと言われている気がします」と語ります。
ルーク氏の言葉を裏付けるかのように、「ハッカーとしての心構え」のページの後半部分では、丁寧に技術の入門について書かれています。
「個人的には、このページに載っている技術をひと通り身につけても、そのあとで深掘りしていく調べ方や考え方、行動が伴っていないと、ハッカーとしての成長はそこで止まってしまうと思っています」とルーク氏は言います。
ハッカー体験①~考えてみる・整理してみる・調べてみる~
ここからは、いちハッカーとして初めて本格的に、公開鍵に触れるという設定のもと、ハッカーならどのように知識を深めていくのか、どうすればディープなハッカーの世界にたどり着けるのか、具体的に体験しながらルーク氏なりの考えを説明していきます。
いきなり解説に入る前に、まずは今回やることのステップを確認しましょう。ステップの確認は、ルーク氏が大事にしている情報の深掘りの仕方であり、このように整理できます。
- 考えてみる
- 整理してみる
- 調べてみる
- 触ってみる
- いじってみる
- 利用先を考えてみる
- 問題を探してみる
まずは「考えてみる」ことから始めましょう。今回のテーマは「公開鍵」なので、鍵やコンピュータの文脈から、「キー」や「パスワード」などが思い付きます。「鍵といっているからパスワードみたいなもの?」「情報を守るためのもの?」「公開してもいいのかな?」などといった疑問が、頭の中にモヤモヤと浮かんでくるのではないでしょうか。
公開鍵についての情報をいきなりGoogle先生に聞くのではなく、まず考えて整理してみることで、自分はテーマについて何が分かっているのか、何が分かっていないのか整理できます。
次に、自分が分かっていることを整理してみましょう。
このあたりまで頭の中を整理できたところで、次は実際に調べていきます。今回は技術的なテーマなので、Qiitaで調べましょう。LGTM数順で並べてみるといいかもしれません。
調べてみると、やはりSSHやHTTPSといったキーワードがたくさん出てきました。基本的な情報収集は、このようにして進めていきます。
今回は、公開鍵の内容について網羅的に解説されているこちらの記事を参考にします。
この記事を読み進めると、公開鍵には暗号化とデジタル署名と鍵交換という3種類の方式があること、実装によって対応しているものと対応してないものがあることが分かりました。
この図では赤枠で囲っている「RSA」は、暗号化とデジタル署名、そしてグレーアウトしているものの鍵交換にも対応しているので、より詳しく見ていきます。
例え話で学ぶRSAの基礎知識
下の図はRSAの概念を簡略化したものです。
左をアリスさん、右をボブさんとしましょう。アリスさんは、2つの大きな素数pとqを用意します。さらに、pとqを掛け合わせて算出した数nと素数p、qからある操作をして得られる数dとeも準備しておきます。
アリスさんは、nとeを公開鍵としてボブさんに送ります。このとき、nとe、nとdから作られる2つの数は、もう片方のペアでしか元に戻すことはできません。この性質を用いてボブさんがnとeを使って数を作った場合、nとdを持っているアリスさんしか元に戻す数を作ることはできません。これが暗号化の仕組みです。
そしてnとdを持つアリスさんが同じ操作で数を作ると、今度はnとeを持っているボブさんをはじめとする全ての人は、「この数はアリスさん以外の人物は作れない」ことが分かるため、本人確認の手段であるデジタル署名として機能します。
また、共通鍵、つまりパスワードのようなものを暗号化してアリスさんに送れば、アリスさん以外にパスワードを知られることなく安心して共有できます。これが鍵交換です。
このようにRSAは、2つの素数から生み出される3種類の数を使ったアルゴリズムで、暗号化、デジタル署名、鍵交換の3つの機能を全て網羅しています。
仮に第三者であるCさんがnとeを盗み出して悪用しようとしている、と仮定しましょう。Cさんはアリスさんになりすまそう、あるいはボブさんの秘密のメッセージを読んでしまおうとしています。
ただ、これは失敗してしまいます。
なぜかというと、アリスさんになりすますにも、ボブさんの秘密のメッセージを読むにも、n、eと対になるdという数が必要になりますが、これは素数のp、qがないと分かりません。大きな数の素因数分解は非常に難しいので、nからp、qを復元できないのです。
これらを総合すると、このようなことがわかりました。
ハッカー体験②~触ってみる~
今度は実際に手を動かしてみることで、RSAへの理解を深めていきましょう。
Qiitaを検索して、秘密鍵の作り方や公開鍵の取り出し方を調べてみると、いろいろな方法が表示されます。今回はopensslコマンドを使ってみましょう。
まず、秘密鍵を作成してみます。
openssl genrsa -out privkey.pem 2048
できあがったprivkey.pemの中身を確認してみると、文字の羅列が表示されました。
同じ要領で公開鍵も作ってみましょう。ここでコマンドを確認すると、秘密鍵を受け取って公開鍵を出力するというものになっています。ということは、公開鍵を無くしてしまっても、秘密鍵があればもう一度公開鍵を作れることが直感的に分かります。
openssl rsa -in privkey.pem -pubout > pubkey.pem
中身は秘密鍵よりかなり短いですね。
次に、3種類の機能のうち暗号化を試してみます。公開鍵を使い、Hello, World!という文字列を暗号化してみました。中身を確認すると、元の情報が分からなくなっています。
試しに秘密鍵を渡して、復号してみましょう。Hello, World!というメッセージが復元できていることが分かります。
実際に手を動かしてみると、
- 2種類ファイルができた
- 暗号化したファイルの内容は読み取れない
- 暗号化と復号の両方ができた
- アリスさんの例では出てきた素数が表に出てこない
ことを体感できたのではないでしょうか。
ハッカー体験③~いじってみる~
知識を深めるには、ここからさらに深掘りしていくことが重要です。
まずは暗号鍵の中身を見て、素数を探すことがミッションです。ファイルを開いても記号化されていて中身は分かりませんが、復号に素数を使っているので、おそらくこの中に埋め込まれているはずだと予測できます。
やみくもに解析しても分からないので、RSA鍵と証明書のフォーマットを検索します。拡張子の.pemや、ヘッダー部分のBEGIN RSAで検索をかけて表示される記事を見てみましょう。
このページに載っている情報を読み進めた結果、
- PEMというフォーマットを使っていること
- ASN,1という、JSONみたいにデータをシリアライズする書き出し方法の1つであること
が分かりました。
ということは中身にデータが入っているので、それを解析できればコードが分かるはずです。そして、鍵を作るのに使うopensslコマンドには、鍵の中身を表示する機能もあるようです。
記事に載っているコマンドを実行して、秘密鍵の中身を見てみましょう。相変わらずよく分からないデータが並んでいますが、ラベルがついて見通しがつきやすくなりました。
スクロールしていくと、prime1とprime2が出てきました。prime1とprime2は素数に関する情報が入っている箇所です。
Pythonを使って、分かりやすいように10進数に基数を変換してみると、素数は巨大な数であることが分かりました。
これが本当に素数なのかを確かめてみると、矢印で示した箇所に「is a prime(これは素数)」と表示されています。
続いて公開鍵の中身を見てみましょう。先ほどと同じようにデータの中身を見るコマンドを入力してみると、このようになります。「modulus」とは、先ほどの概要説明における数nのことを指します。
nが実際に2つの素数を掛け合わせた数になっているか確認しましょう。Pythonに取り込んで計算すると、modulusがあって、その下にprime1とprime2を掛け合わせたものがあります。バッチリ一致していますね。実際に手元で確認したことで、RSAの秘密鍵と公開鍵が身近に感じられるのではないでしょうか。
ハッカー体験④~利用先を考えてみる~
次のステップ「利用先を考えてみる」とは、どういうことなのでしょうか。公開鍵のように古くから使われている技術は、既に先人が無数の利用先を作っています。冒頭で紹介した「ハッカーの5つの心構え」に立ち戻ると、「同じ問題を二度解く無駄はいやだ」という要素があるので、利用先を考える意味はないと思うかもしれません。
ただ、ここでルーク氏が言いたいのは、「利用先を想像する」「実際の利用先を探ってみる」ことが重要だということです。
例えば、誰が作ったのか特定できる署名機能を通信に使えば、今通信している相手の認知に役立つでしょう。調べてみると、まさにSSHでは公開鍵のデジタル署名を認証に使っていることが分かりました。
このように、「こういうことに使える気がするな」とあたりをつけた上で、さらに調べてみることで、先人がたどってきた知識の道筋を、猛スピードで突っ切っていくことができるとルーク氏は説明します。
もし、想定していた利用先が見つからない場合は、なぜ実現できないかという切り口で調べてみましょう。こうして再帰的に知識を深めていくことで、最初に調べたかった公開鍵の知識だけでなく、背景や利用先の知識も広がり、基本的な部分の理解をより一層深められます。
ハッカー体験⑤~問題を探してみる~
最後のステップ「問題を探してみる」では、公開鍵の仕組みだけでは解決できない問題と、それを他の技術でどのように解決してきたのかを紹介します。
RSA特有の問題である、「素数は分解できないことは保証されているのか(安全だと言い切れるのか)」という点に着目しましょう。
実際に調べてみると、実はRSAは安全ではないかもしれないという記事があります。量子コンピュータという新しい技術を使うと、現実的な計算量(オーダー)で数nから素数p、qを取り出せることが分かりました。
これを聞くと素数が分かるなんて大問題だと思うかもしれません。しかし、記事を読み進めていくと、今は量子コンピュータが実用化されているとは言えないこと、実用の域に入ったとしても、量子ビットを増やさないと暗号は解読できないことが載っているので、まだしばらくは安全そうです。
ただ、量子コンピュータが発展した未来には、RSAの安全性が失われるかもしれません。そこで、量子コンピュータが発展した未来に向けた研究も調べてみると、量子アルゴリズムが発展しても解析されない暗号方式があると分かりました。その暗号方式は、既に通信分野で実験的に使われています。
「自分は量子コンピュータの知識に明るくないのですが、調べて掘り下げていくと、こんなところまでたどりつくことができます」とルーク氏は言います。
もう1つ、RSAに限らず、公開鍵で一般的に懸念されている問題を見てみましょう。「公開鍵を盗まれても大丈夫だけど、仲介されても大丈夫?」というものです。
「仲介」とは、この図のように悪意を持ったCさんが別の素数pとqを「アリスさんのものだよ」とだましてボブさんに送るような状況です。こうなるとボブさんは、送られてきた素数が本当にアリスさんのものかどうか判断できません。
この問題は「中間者攻撃」と呼ばれていて、公開鍵を語る上で切っても切り離せない関係にあります。これを解決するには、直接会って鍵を確かめて交換するといった原始的な方法がありますが、世界中の人と会うことは現実的ではありません。
こうした背景を受けて開発された技術を2つ紹介します。1つはWeb of TrustとPGP(Pretty Good Privacy)です。直接握手はできなくても、他の人の握手をもとに、「友だちの紹介ならある程度は信用できる」という考え方です。
この仕組みのデメリットは、1人ひとりが秘密鍵を管理して、個々人で侵害に気づかないといけないのでハードルが高いことです。
このデメリットを克服したもう1つの方式が、「公開鍵認証基盤・認証局」です。この方式は「通信を開始した側がトップに君臨する公開鍵を信頼することで、その公開鍵が認証した他の公開鍵を全て信頼する」仕組みになっています。今みなさんがつないでいるこのWebページも、この方式で信頼されています。
例えばルーク氏のブラウザでは、鍵のアイコンをクリックすると、この画面が表示されると言います。
さらに証明書のマークをクリックしてみると、その中身が表示されます。qiita.comは3番目に出てくる公開鍵を持っており、Amazonが発行している一番上の公開鍵を信頼することで、Qiitaの公開鍵も間接的に信頼しています。
それでは、いつAmazonの公開鍵を信頼するような操作をしたのか、疑問に思うかもしれません。実は、私たちはパソコンを買った時点でトップの公開鍵を信頼しているのです。自分が信頼していない内に勝手に信頼されている、ということに違和感を覚えるかもしれませんが、OSの提供者が信頼しているAmazonが信頼しているQiitaを信頼する、というように間接的に信頼を繋いでいく様は、他人の握手を信頼していくWeb of Trustと本質的には変わらないことがわかるでしょう。
今回は暗号化技術のRSAをテーマとして取り上げました。中身はどうなっているのか疑問を持ち、実際に自分の手を動かし、芋づる式に掘り下げて調べてみることで、ハッカーの視点を得られるとルーク氏は語ります。
「今回ご紹介した調べ物の手順や物事の裏側を掘る方法、考え方こそがハッカーのルーチンワークだと自分は考えています。この考え方を活用して、ハッカーコミュニティを活性化したいと思っています」(ルーク氏)
ハッカー的な視点を生かせるゆめみ
ルーク氏が時折読み返している「How to Become a Hacker」のサイトには、このような文章があります。
要するに、ハッカーの文化や技術はソフトウェアやハードウェアの領域に閉じたものではなくて、広く一般的に当てはまるものです。ハッカーのように物事と向き合うことで、私たちはより良いものを作り出せるのではないでしょうか。ルーク氏は、ゆめみのことを、ハッカーのような視点を持った人材が活躍できる場所だと紹介します。
「当社は、ハッカーにとっては夢のような空間です。もちろん、技術を使ってクライアントの悩みを二人三脚で解決するという、エンジニアとして貢献するマインドも生かせるのですが、そこには留まりません」
ゆめみの特長を技術者に馴染みのある言葉で説明すると、メンバー全員にsudo権限が付与されているサーバーのようなものだ、とルーク氏は続けます。「改善したい」と思うことがあれば、1人ひとりがアップデートできるわけです。
もちろん、周りのメンバーも積極的にサポートしてくれるなど、会社のコアな部分に安全に触れられる体制は整っています。この体制は、普段エンジニアとして活動するルーク氏が取締役を買って出た理由にもなっています。エンジニアとしての仕事をこなしつつ、ゆめみという会社をハッキングすることも楽しみながら行っているそうです。
ルーク氏は最後に「ゆめみでは、会社のあり方そのものを、ある種のハッカー精神にのっとって検討しながら、社会の歪みをなくすことを真剣に目指しています。私たちと一緒にこの目標に取り組んでみませんか?」と締めくくりました。