エンジニア的ゲーム理論

FFXIVやPCが好きなフリーランスのエンジニアが理屈をこねる。

知っておいて損はないワンタイムパスワードの仕組み

ワンタイムパスワードについてのそこそこ詳しい話です。今回はスクエニアカウントにおけるワンタイムパスワードのことを書きますが、他のワンタイムパスワードを利用しているサービスでも同じような仕組みになっています。

ワンタイムパスワードとは

ワンタイムパスワード (英: one-time password、OTP) とは、コンピュータリソースに対するアクセス用に発行される、一度限り有効なパスワードのことである。(Wikipediaより)

以下、ワンタイムパスワードのことをOTPと呼びます。

2段階認証とは

通常のユーザID/パスワードのマッチングによる認証のほか、ユーザしか持ちえない固有のレイヤーの情報を用いて2つ目の認証を行うことを2段階認証と呼びます。

Multi-Factor Authentication (MFA:多要素認証) と呼ばれたりもします。OTPの場合はトークンが「ユーザしか持ちえないレイヤーの情報」にあたります。

FF14におけるOTP

すでに理解した上で使用している方が大多数だと思いますが、おさらいします。

通常のパスワード認証というのは、

  • ユーザIDとかユーザ名
  • パスワード

この2つの要素によってユーザ本人かどうかの認証を行います。

しかし、セキュリティリスクが多様化した現代において、この2つの情報、とりわけ文字データでしかない2要素での認証というのは非常に危険です。

例えば、

  • キーロガーによる直接的な盗聴
  • フィッシングによる中間者攻撃
  • ブルートフォースアタックによる総当たり攻撃
  • 誕生日や趣味趣向などからパスワードを割り出すソーシャルハック
  • 同じIDやパスワードを使いまわしている別サービスからの流出

などなど、IDとパスワードが流出することは多いに有りえます。

実際に、FF14でもサービス開始から間もないころ、たくさんのユーザが乗っ取り被害に遭いました。私のフレンドもRMT業者に乗っ取られてシャウト宣伝BOTになっていたこともありました。OTPは、このような乗っ取り対策として打ち出された、とても強固なセキュリティ担保ツールというわけです。

詳しい仕組みは後述しますが、これを導入することにより乗っ取り被害の大部分は防げることから、FF14でも運営チームがとても強く導入を推奨しています。

面倒くさがるユーザに対してもメリットを与えられるように、OTPを利用するだけでお気に入りテレポ(無料)が一箇所増える、という力の入れようです。

本来、ユーザが自分自身を守るためのツールのために、運営がシステム側で利点を作る、というわけですから。

OTPを導入するとどうなるのか

  • ゲームにログインするとき
  • Lodestoneにログインするとき
  • モグステーションにログインするとき
  • コンパニオンアプリにログインするとき

通常のユーザID/パスワードの他に、6桁のパスワードの入力を求められるようになります。これがOTPです。

OTPは発行するたびに変動し、このOTPを発行するツールをトークンと呼んでいます。

スマホアプリとしてインストールするソフトウェアトークン、専用のハードウェアによるハードウェアトークン、どちらも仕組みは同じです。以後、どちらもOTPトークンと呼びます。

OTPはなぜ安全なのか

初めてOTPトークンとアカウントを紐付ける際に、特殊なパスワード(数値)の入力を求められたことがあると思います。

サーバ側で秘密の鍵を発行して文字列を表示し、それをOTPトークンに登録する重要な操作です。この操作により、サービスとOTPトークンの間で、ユニークな固有認証情報(秘密鍵)が共有されます。サービス側では、この情報をアカウントと紐づけます。

つまるところ、サービス側で「このOTPトークンは、このアカウントの正しい持ち主であることの証である」という情報が登録されるわけです。

OTPトークンが出力するOTPは、6文字という短い数字でありながら、常に自分のOTPトークンの固有情報を含んでいます。

そのため、正しいOTPを入力できる=アカウントの持ち主本人によるアクセスである、ということの証明ができるのです。

OTPの仕組み

OTPの発行

OTPは発行するたびに異なる値を出力します。

これは時間ベースのOTPという考え方で、TOTP(Time-Based One-Time Password)としてRFC6238にも規定されています。

エンジニアでない方にとっては初耳かもしれませんが、時間というのは数値化が可能なものです。この値はUNIX時間などと呼ばれ、世界協定時(UTC)における1970年1月1日午前0時0分0秒からの経過秒数を示す数字がそれです。時刻カウンターとでも呼んでおきましょうか。

例えば現在この記事を書いている時刻をUNIX時刻に変換すると

  • 2018年09月07日 金曜日 12時35分00秒 → 1536291300

となります。人類がパッと見ても意味がわかりませんが相手はコンピュータなので気にしない。

この時刻カウンターと、前述の秘密鍵情報を用いてゴニョゴニョ計算した結果が、6桁の数字、OTPとして出てきます。

ざっくり言うと、

  • OTPトークン固有情報 × (時刻カウンター + スクエニ独自計算ロジック) = OTP

となります。

OTPの検証

このOTPを受け取った認証サーバは、入力された値が正しいものかどうかを判別しなきゃいけないわけですが、これはとてもシンプルな仕組みです。

計算に使用している秘密鍵情報は、OTPトークンと認証サーバとの間で共有しているわけですから、受け取ったOTPの値に対して検算を行います。

先の例を使用して検算するなら、

  • OTP ÷ (時刻カウンター + スクエニ独自計算ロジック) = OTPトークン固有情報

となるはずです。

割り出したOTPトークン固有情報が、入力されたユーザアカウントのものであるかどうか特定し、一致していればログインしていいよ!ということになります。

余談ですが、OTPトークンがOTPを発行した時刻と、サーバ側でOTPを受け取って検算を始める時刻とでは当然ズレがあります。なので、サーバ側では1分以内ぐらいの誤差だったら同じOTPトークンからのOTPであると割り出せるような計算ロジックが組んであります。人間がOTPを入力するタイムラグや、通信のタイムラグを考慮した実装にしましょうね、っていうのは前述のRFC6238でも推奨されています。

スクエニのOTPは真のOTP

皆さんお気づきかどうか分かりませんが。

同時刻にゲームとLodestoneに同時にログインしようとしたとしましょう。

どちらのログインにも、同じ時間に発行された同じOTPを入力します。すると、後からログインしようとした方はログインに失敗します。

つまりこれは、最後に認証に成功したときの時刻カウンターの値をサーバ側で保持していて、より新しい時刻カウンターを用いたOTPでないとログインできない、ということです。これは真のワンタイムパスワードです。素晴らしい!

じゃあ真じゃないワンタイムパスワードって何なのか。

ちょっと邪悪な例ですが、例えば正規のユーザがOTPを発行して入力してログインするまでの間に何らかの形でOTPが盗み見られたりして、悪意ある攻撃者がパパパっと操作を行った場合、悪意ある攻撃者のログインが成立していまいます。正規のユーザがログインできない、ということになればすぐに気付けるのですが、そうでない場合はどちらもすんなりログインできてしまいます。同じパスワードで複数回のログインが成立してしまうのは、"ワンタイム"なパスワードではないよね、という話です。

とはいえ例の通りで、スクエニのOTPも盗み見られたりして、盗み見た人の方が先にログインをしようとしたら出来てしまうので、そのへんは注意が必要ですね。

みなさんもワンタイムパスワードを利用して安心安全なエオルゼアライフを。