2011/12/25
■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).
google-authenticator - Two-step verification - Google Project Hosting
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.
google-authenticator - Two-step verification - Google Project Hosting
ということで、OTP生成のしくみは2つに対応しているということですね。
- HMAC-Based One-time Password (HOTP) http://tools.ietf.org/html/rfc4226
- Time-based One-time Password (TOTP) http://tools.ietf.org/html/rfc6238
これは過去のブログには書いてないものの何度か調べたことがあったことを思い出しました。
日本語で説明されているものはそんなに見つかりませんが、こちらとかはどうでしょうか。
Google Authenticatorの設定のときに、Webの画面からQRコードを読み込むことで30秒おきに変化するOTPの値が表示されるようになります。
- QRコード読み込みの際に、"Email"と"SECRETをBase32した文字列(KEY)"(とTOTPを使うこと)が渡され設定される
- PAM用のコードも提供されているため、SSH認証にも利用可能 (参考 : Linux サーバの SSH 認証を Google Authenticator 対応にしよう (CentOS 5.6) - Kenichi Maehashi’s Blog)
- 手動で(Email)/(KEY)/(HOTPもしくはTOTPどっちを使うか)を設定できる
最後の点については、
- Google以外のサービスでも同じロジックを使ってKEYを払いだせればGoogle AuthenticatorをOTP作成クライアントとして利用できる
とも言えますね。
このあたりでググってみると、PHPでの実装を紹介しているエントリを見つけました。
上記サイトにあるPHPコードを使って30秒ごとにOTPが払いだされること、Google Authenticatorに同じKEYを設定すると同じOTPが払いだされることまでは確認しました。
自分で同じようなOTP作成を実装するのも良いですが、どうせならGoogle Authenticatorから払いだされたOTPを受け付けて何かやるWebサービスのデモを作ってみたいですね。例えばConnectのデモOPで2要素認証使ってみるとか。
今年も残り少ないですが頑張りましょう。
ではまた。
- 23 http://t.co/dfOnGGMK
- 21 http://www.google.co.jp/url?sa=t&rct=j&q=facebook 友達を検索&source=web&cd=7&ved=0CGAQFjAG&url=http://d.hatena.ne.jp/ritou/20101018/1287421348&ei=pO73TtbGEMWNmQXz6KSjAg&usg=AFQjCNG8Kngq44zQIK-jE4PXQk3rczWIt
- 18 http://search.yahoo.co.jp/search?p=Facebook 検索 友達&rs=3&tid=top_ga1_sa&ei=UTF-8&aq=5&oq=ふぁせぼおk&fr=top_ga1_sa
- 16 http://oauth.jp/oauth-20openid-connect
- 12 http://reader.livedoor.com/reader/
- 11 http://www.google.co.jp/url?sa=t&rct=j&q=フェイスブック 閲覧履歴&source=web&cd=21&ved=0CDUQFjAAOBQ&url=http://d.hatena.ne.jp/ritou/20101018/1287421348&ei=WMD3TorxH4
- 11 http://www.google.co.jp/url?sa=t&rct=j&q=facebook+友達検索&source=web&cd=7&ved=0CF0QFjAG&url=http://d.hatena.ne.jp/ritou/20101018/1287421348&ei=c234TuzLAYyNmQWd07mkAg&usg=AFQjCNG8Kngq44zQIK-jE4PXQk3rczWItA
- 11 http://www.google.co.jp/url?sa=t&rct=j&q=openid connect&source=web&cd=4&ved=0CE0QFjAD&url=http://d.hatena.ne.jp/ritou/20110718/1310939367&ei=fg_4TraIAs_AmQWo5cShAg&usg=AFQjCNFnl42j-zs73pOywb0XhCChxgkttg&sig2=MfKPZjYnhDFt0e5QlkQa9w
- 10 http://www.google.co.jp/url?sa=t&rct=j&q=facebook 検索履歴&source=web&cd=6&ved=0CE4QFjAF&url=http://d.hatena.ne.jp/ritou/20101018/1287421348&ei=Q-D5TpjSJc7ImAWf5bS2Ag&usg=AFQjCNG8Kngq44zQIK-jE4PXQk3rczWItA
- 8 http://tzmtk.posterous.com/oauth20-1
