こんにちは。
以前仕事で二要素認証の実装に詰まり、デバッグのためにTOTPを原理から勉強をしました。意外とわかりやすくて面白かったので、せっかくなら共有しようと、社内でハンズオン授業という形で勉強会を開いてみたという話をします。

Google Authenticatorで生成されたTOTPの例(画像はwikipediaから)
なぜ授業なのかというと私が塾講師を五年半ほどやっていたため、個人的に馴染みのある形式だからです。
どんな授業をしたのか、勉強や授業を通して何を新たに知ったのか、Google Slideの資料作りで何に苦戦したのかを軽く紹介していこうと思います。
また今回のハンズオン演習に使用した資料は、参加者への共有のためにもGitHub上でrepositoryとして管理しています。
授業構成
わかりやすいとは言っても、唐突にTOTPの実装レベルの話をしても理解不能です。段階を踏んで説明しました。
- 認証とはそもそも何か
- 認証したいユーザーであることの証明
- ハッシュ
- 不可逆で予測困難な値の生成
- HMAC
- 鍵付きハッシュ関数
- 認証と改ざん検知を兼ねる
- HOTP
- 改ざん検知を捨てて使い捨て認証を導入
- TOTP
- 軽い使い捨て認証と利便性(同期が簡単)
どこまで深く見るのかにもよりますが、どういった原理でOTPを生成しているか?という概念レベルでは、基本情報が取れるくらいの知識があればRFCを紐解いて十分理解できるくらいの難易度です。
ハッシュ関数の性質を理解している方であれば、一読してみる価値はあるのかなと。
ハンズオン要素
ここはちょっと頑張ったところなのですが、今回の授業では参加者のためにOTPカードを用意しました。
このスライドの左部分にあるものです。A5サイズの実物として紙を用意し、これを参加者に配って回りました。
ハンズオン演習はこのような項目立てで行ったのですが、各所で役に立ってくれました。
- ハッシュでペアリング
- 同じキーワードで2枚ずつ配り、演習ペアをハッシュ値の一致で探してもらった
- 「キーワードを公開せず、しかし『同じキーワード』を条件にペアを探す」ハッシュ化の意義
- メッセージとHMACをセットで送受信し、なりすまし検知
- キーワードのハッシュ値を共有秘密鍵としてHMACを作成
- 鍵を持たない私が同じメッセージでなりすまし、違うHMACになることでなりすましを看破してもらった
- TOTPの作成、答え合わせ
- HMACをベースにTOTPを手元で作成してもらい、AuthenticatorやペアとTOTPが合致することを確認する
- カードのQRコードを自分のAuthenticatorで読み取ってもらった
「いつも使っているAuthenticatorと同じ値を自分の手で出せた」という体験を、カードのおかげで作れたのではないかと思っています。
今回知れたこと
「人に教える」という行為は、頭の中の理解を体系化するのに非常に役立ちます。単純に私が何かを人に教えるのが好きというのはありますが、結果的に自己研鑽としても実りある企画になったのではないかと思っています。
実際に資料作りを通して、私が学べたことをいくつか挙げてみます。
1. OTPは送受信するものではない
授業というより勉強の段階で知ったことですが、一番衝撃の大きい知見でした。
OTPはメールで送られたりすることもあり、認証元が送り、認証端末が受信してそれを入力するものだと私は思い込んでいました。
ところが勉強してみるとそうではなく、双方がそれぞれ勝手に計算しているものでした。
計算にはハッシュ化を使っており、同じキーを認証したいユーザーとだけ事前共有することで同じ出力を得る、というのが大まかな認証原理ということでした。
事前共有さえ済んでいれば、オフラインであっても認証が可能というわけですね。
2. ハッシュ化は認証そのものの役に立たない
よく考えてみてやっと気づいたことでした。
パスワードの保護や今回のHMACでも認証にハッシュ化が絡むので、なんとなく「認証といえばハッシュ化」というイメージがありました。実際それは間違っていないと思うのですが、実のところハッシュ化は認証そのものには全く寄与していなかったのです。
認証がいつ崩れるかというと、それは認証の秘密が外部に漏れ、当事者間以外も知る情報になってしまったときです。
このとき、認証時に秘密(パスワードなど)を直接渡すにしろ、秘密のハッシュ値を渡すにしろ、漏れれば認証は破綻します。それをそのまま使いまわせばいいのですから。
認証という文脈では、ハッシュ化は秘密そのものの内容を守る役割を持つに過ぎず、ハッシュ化したからといって認証フローが安全になるということは全くなかったのです。盗聴からのなりすましを防ぐことはできないのですね。
だからこそ、秘密の流出には常に気を配る必要があるということでもあります。
3. OTPの形式はカスタマイズ可能
通常TOTPは6桁、30秒リフレッシュで生成されますが、実は認証サーバー側の設定でこれらをカスタマイズすることができます。8桁のOTPなど見たことがあるかもしれません。
また他にも、ハッシュ関数は基本的にSHA-1が使われていますが、より強固なSHA-256を設定するなどもできます。
余談ですが、SHA-1は脆弱なハッシュ関数と聞いていたため「なぜSHA-1を使っているのだろう?」と思った疑問を解消できたのはよかったです。なぜTOTP(というよりHMAC)では問題ないかはぜひ調べてみてください。
そのほかにも、そもそも認証ってなんだ?といった根本的なところから認識をアップデートできたりと、参加者だけでなく私にとっても大きな学びがありました。
授業した側の感想
A5の物理的な紙でペアカードを用意したのは我ながら面白い策を思いついたものだなと思います。ハンズオン形式も手伝い、印象に残る授業を展開できたのではないかなと。
しかし1時間という限られた枠に必要な情報を詰め込むのも含め、なかなか準備が大変でした。今後もこうした授業をテーマを決めてやりたいと思いますが、どう続けたものかというのが目下の悩みです。
スライドの作成などもAIを使って省力化できればやりやすいか?など、色々と解決策を考えてみています。もし何か資料作りに有益な情報があれば、ぜひ共有していただけると嬉しいです。
おわりに
私がこうした勉強会を主催したのは、単純に自他の学びとしてという面は当然ありますが、それともう一つ「社内で自発的に勉強会を開くハードルを下げたい」という目論見もあります。
これを掲げるからには、どんな形であれもっと頻繁に開催することが不可欠です。テーマ探し〜発表まで、モチベーションだけに頼らない形を模索していきます。発表内容だけでなく、発表のための体制が定まればそれも記事に起こしたいと思います。
株式会社シンシアでは、実務未経験のエンジニアの方や学生エンジニアインターンを採用し一緒に働いています。
※ シンシアにおける働き方の様子はこちら


