2011-02-05

Google Authenticator で簡単に二要素認証を実装する

二要素認証としてワンタイムパスワード生成機を使うには、専用のトークンとか高そうなパッケージが必要そうなイメージ (例: RSA SecurID) がありましたが、iPhone, Android アプリ として公開されている Google Authenticator を使うと簡単に使える感じなので試してみました。

Google Authenticator は OATH で定義されているオープンなワンタイムパスワード生成方法 HOTP (HMAC-based One Time Password)TOTP (Time-based One Time Password) に対応していて、QRコードまたは文字列入力で、Base32 でエンコードされた秘密鍵を登録しておくと、勝手にワンタイムパスワードを作ってくれます。

ワンタイムパスワードの生成方法は、メッセージ認証符号 HMAC SHA1 でカウンター値 (HOTP) または30秒単位の時刻 (TOTP) を処理して、その結果を入力しやすい桁数 (6桁以上) の数値に変換するという感じのようです。

サーバーサイドでは、Perl なら Authen::OATH を使って、同じ秘密鍵を持っていることを、同じワンタイムパスワードの数値が入力されたことでもって認証するという感じでいいと思います。Authen::OATH には Base32 の文字列をそのまま突っ込むのではなく、元のバイナリ値を入力とすることに注意しましょう。