はちゅにっき

こっちのブログはまったり更新

2段階認証を実装したい

ちょっとした理由から Google などで使われている 2段階認証を実装してみることに。
Google の 2段階認証の場合はワンタイムパスワードを生成に、以下のスマホアプリを利用することができますので、今回はこのアプリに相乗りする形での実装を目指しました。

Android

Google 認証システム - Google Play の Android アプリ

iPhone
Google Authenticator

Google Authenticator

  • Google, Inc.
  • ユーティリティ
  • 無料

相乗りとは言っても仕様は広く一般的に使われているため、同様のアルゴリズムで実装されたアプリであれば、他のアプリでもワンタイムパスワードを発行・認証することができます。


欲しい!と思ったものはだいたい揃っている CPAN
当然ワンタイムパスワードについても Authen::OATH - search.cpan.org というモジュールが既に存在しており、Google Authenticator での認証にも対応しています。
ということで、早速インストールしてみると。。。

$ cpanm -L Hoge Authen::OATH
--> Working on Authen::OATH
Fetching http://www.cpan.org/authors/id/S/SI/SIFUKURT/Authen-OATH-v1.0.0.tar.gz ... OK
Configuring Authen-OATH-v1.0.0 ... OK
==> Found dependencies: Moose, Digest::HMAC, Digest::SHA1
--> Working on Moose
Fetching http://www.cpan.org/authors/id/E/ET/ETHER/Moose-2.1201.tar.gz ... OK
... ()
Successfully installed Authen-OATH-v1.0.0
27 distributions installed

はい、ということで依存モジュール多すぎだし、なんといっても Mooooooooooooooooooose!
なんかソースコードを見てみるとびっくりするほど Moose である必要がなかったため、いっそこの際コアのアルゴリズム部分も含めて実装し直してみることにしました。

Auth-OATH-OTP
hatyuki/p5-Auth-OATH-OTP · GitHub

調子に乗ってベンチマークもとってみました

Auth::OATH::OTP:  4 wallclock secs ( 3.86 usr +  0.01 sys =  3.87 CPU) @ 25839.79/s (n=100000)
Auth::OATH::OTP (reuse):  4 wallclock secs ( 3.58 usr +  0.02 sys =  3.60 CPU) @ 27777.78/s (n=100000)
Authen::OATH: 33 wallclock secs (33.38 usr +  0.05 sys = 33.43 CPU) @ 2991.33/s (n=100000)
Authen::OATH (reuse): 12 wallclock secs (11.84 usr +  0.03 sys = 11.87 CPU) @ 8424.60/s (n=100000)
                           Rate Authen::OATH Authen::OATH (reuse) Auth::OATH::OTP Auth::OATH::OTP (reuse)
Authen::OATH             2991/s           --                 -64%            -88%                    -89%
Authen::OATH (reuse)     8425/s         182%                   --            -67%                    -70%
Auth::OATH::OTP         25840/s         764%                 207%              --                     -7%
Auth::OATH::OTP (reuse) 27778/s         829%                 230%              8%                      --

Moose を卒業しただけでだいぶ早いですね。
ついでに、使い方のイメージ等々を含めてサンプルアプリもつくってみました。

デモ
Auth::OATH::OTP Demo

ソースコードは上記リポジトリおいてあります
ということで、わーい。