Googleの2段階認証で使われているOTPの仕様が気になった

こんばんは、ritouです。

最近、Googleでいわゆる2段階認証といわれる2要素認証のしくみが日本のモバイル端末でも利用可能になりました。
利用方法などは既にネット上に広まっているので今回は省略して、その中で使われている追加の認証機能に注目します。

Googleの2段階認証について

説明は公式のドキュメントを参考にしましょう。

日本のモバイル端末でも利用可能になったということで説明されたエントリも出ています。

これでだいたいわかると思いますが、概要はこんな感じです。

  • Email/PWに加えて追加の認証を利用できる
  • 認証コード通知方法(1) : 携帯電話へのメールで通知
  • 認証コード通知方法(2) : 電話(携帯以外もOK?)への電話で通知
  • 認証コード通知方法(3) : iPhone/Android/BrackBerryのGoogle認証システムというアプリで表示された値
  • 認証コード通知方法(4) : 最終手段として7文字の数値×10個が表示され、それぞれ一回ずつ使える
  • 自分しか利用しない端末の場合は、利便性向上のために30日間2段階目の認証をスキップさせることもできる

認証コードについてですが、(4)はアカウントと払いだした数値列と利用済かどうかのフラグなどを紐づけておけば実装できそう。
(1),(2)で通知される認証コードについてはひとまずおいておいて、(3)のiPhone/Androidなどのアプリが気になります。

Google認証システムというアプリ

iPhone/AndroidなどではGoogle認証システム(Google Authenticator)と呼ばれるアプリケーションを利用しています。

私が試したAndroidアプリはこちらです。

OTPを払いだすためにこのアプリがGoogleと通信などをするようでは圏外で使いものにならないし、中身どうなってるのかなと思いきや、ソースコードが公開されています。

One-time passcodes are generated using open standards developed by the Initiative for Open Authentication (OATH) (which is unrelated to OAuth).

GitHub - google/google-authenticator: Open source version of Google Authenticator (except the Android app)

OATHはOAuthではありません。

These implementations support the HMAC-Based One-time Password (HOTP) algorithm specified in RFC 4226 and the Time-based One-time Password (TOTP) algorithm currently in draft.

GitHub - google/google-authenticator: Open source version of Google Authenticator (except the Android app)

ということで、OTP生成のしくみは2つに対応しているということですね。

これは過去のブログには書いてないものの何度か調べたことがあったことを思い出しました。
日本語で説明されているものはそんなに見つかりませんが、こちらとかはどうでしょうか。

Google Authenticatorの設定のときに、Webの画面からQRコードを読み込むことで30秒おきに変化するOTPの値が表示されるようになります。

最後の点については、

  • Google以外のサービスでも同じロジックを使ってKEYを払いだせればGoogle AuthenticatorをOTP作成クライアントとして利用できる

とも言えますね。

このあたりでググってみると、PHPでの実装を紹介しているエントリを見つけました。

上記サイトにあるPHPコードを使って30秒ごとにOTPが払いだされること、Google Authenticatorに同じKEYを設定すると同じOTPが払いだされることまでは確認しました。
自分で同じようなOTP作成を実装するのも良いですが、どうせならGoogle Authenticatorから払いだされたOTPを受け付けて何かやるWebサービスのデモを作ってみたいですね。例えばConnectのデモOPで2要素認証使ってみるとか。

今年も残り少ないですが頑張りましょう。
ではまた。