2段階認証を実装したい
ちょっとした理由から Google などで使われている 2段階認証を実装してみることに。
Google の 2段階認証の場合はワンタイムパスワードを生成に、以下のスマホアプリを利用することができますので、今回はこのアプリに相乗りする形での実装を目指しました。
Google 認証システム - Google Play の Android アプリ
相乗りとは言っても仕様は広く一般的に使われているため、同様のアルゴリズムで実装されたアプリであれば、他のアプリでもワンタイムパスワードを発行・認証することができます。
欲しい!と思ったものはだいたい揃っている 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 を卒業しただけでだいぶ早いですね。
ついでに、使い方のイメージ等々を含めてサンプルアプリもつくってみました。