Google Authenticatorを利用してWindowsにログインする

今月末にNCCの合宿があるのですが、そこでLTがあり、何を話そうか考えてみました
ncc.hateblo.jp


(最近何も面白いもの作ってないから話すことない…)

ということで、ふと思い付いた「Google AuthenticatorのOTPでWindowsにログインする」をやってみました


そもそもGoogle Authenticatorって何?
Google Authenticator - Wikipedia
Time-based One-time Password Algorithm - Wikipedia, the free encyclopedia
support.google.com

この辺りを見れば分かると思いますが、要はワンタイムパスワード(OTP)用のアプリケーションで、iOSAndroidで動作し、たまに目にすることがあるかと思います


sshの認証に利用している人もいるようです
仮想化通信 » Google Authenticatorを使ったSSHのワンタイムパスワード認証の設定(CentOS 7)
SSHの認証でワンタイムパスワードを使う(導入編) - 雑記帳(2014-09-12)
tech-sketch.jp


様々なプラットフォームに移植されていて、当然Windows上で動作するサードパーティがあります
gauth4win - Google Authenticator for windows - Google Project Hosting

よし、早速使ってみよう!!と思ったのですが、うーん、よく分からん


もっとさっくり纏めたライブラリみたいなのは無いのかなーって思って調べてみると
www.nuget.org

NuGetにあるじゃん!!!最高じゃん!!!

というわけで、今回はこれを利用させて頂き、簡単にバーっと書いてみました



Google Authenticator Two-Factor Authentication Libraryは非常に分かりやすいライブラリで、NuGetのコンソール上で

PM> Install-Package GoogleAuthenticator

すれば簡単にインストールできます

利用する際は、はじめに

using Google.Authenticator;

とかしておいて

TwoFactorAuthenticator tfa = new TwoFactorAuthenticator();
var setupInfo = tfa.GenerateSetupCode(Issuer ID, Account Title, Account Secret Key, QR Code Width, QR Code Height);
 
string qrCodeImageUrl = setupInfo.QrCodeSetupImageUrl;
string manualEntrySetupCode = setupInfo.ManualEntryKey;

とすることでQRコードのURLとbase64文字列が取得出来ます

各要素について説明すると
・Issuer IDはGoogle Authenticatorなどで表示される、そのアプリケーションの名前です
・Account Titleはアカウント単位で指定する、識別用の名前です
 僕が見てきたものは殆どがメールアドレスを利用していました
・Account Secret Keyはアカウントの秘密鍵です
 10~12文字の英数字(?)で、任意のものを指定して下さい
 また、絶対に自分以外に公開してはいけません
QR Code WidthはQRコードの横幅です
QR Code HeightはQRコードの縦幅です

これらを任意の文字列で設定し、QRコードのURLを取得し、アクセスします
するとQRコードが表示されるので、それをGoogle Authenticatorから読み込むと準備は万端です



認証には以下のように

bool isCorrectPIN = tfa.ValidateTwoFactorPIN(Account Secret Key, PINコード);

Google Authenticatorに表示されるPINコードをValidateTwoFactorPINにAccount Secret Keyと一緒に渡すことで真偽を得ることが出来ます



詳細はここを見れば分かります
というか、上のやつはこれを日本語で雑に書いただけです…
Implementing Free Two-Factor Authentication in .NET using Google Authenticatorbrandonpotter.wordpress.com



というわけで、これでOTPによる認証を行うことが可能になります

基本的には二段階認証用なので、この前のdongliとかと組み合わせると良いかも?
kkrnt.hatenablog.com



今回実装したものはかなり雑なので、もう少しマトモにしてから公開することにします…
忘れない内に頑張って公開出来るようにします…

これでLTは何とかなりそうです("")(。・ω・。)("")