二要素認証を実現する
株式会社クエステトラ
畠中晃弘
二要素認証って何?
ざっくり言うと、「ID / パスワード」と「もう1つ何か」を使って
認証する仕組み。「二段階認証」と呼ばれる場合もある。
(英語では、2-factor Authentication と 2-step Verification)
厳密には、以下のうち、2つを使用して認証する仕組み
● ユーザが知っているもの
○ ID, パスワードなど
● ユーザが持っているもの
○ キャッシュカードやハードウェアトークンなど
● ユーザ自身の特性つまり生体情報
○ 指紋や虹彩など
Google はどうなっているか
Google は、様々な認証を
先進的に提供している
(Web サービスの認証における
ベンチマークと考えてよい)
通常のログイン画面
二要素認証を設定していると
次のチェック画面に遷移する
セキュリティキーを
設定していると、
キーの挿入を要求する
(キーのボタンのタップを
要求する)画面に
「別の方法でログインす
る」こともできる...
これだけ「別の方法」があ
る
「セキュリティキー」
「Google 認証システム」
の優先順位が高い
電話を選択すると、
Google から
電話がかかってきて、
コードを教えてくれる
もちろん、事前に電話番
号を登録しておく必要
「Google Authenticator」という
アプリでコードを確認
Android / iPhone 版が
ある
事前に連携設定をする必要
二要素認証の現状
以下の3つは実用レベル。
いずれもスマホを前提しており、使いやすい。
● 電話番号
● SMS / (別のメールアドレス)
● 認証アプリ
● セキュリティキーは実用レベルに近づきつつある
● 生体認証はまだまだ
自社のWeb サービスに、
スマホによる二要素認証を導入するには
● Authy (http://www.authy.com)
○ SMS と認証アプリに対応
○ 費用がかかる
○ Web サービスは Authy のユーザID を共有する必要
○ 細かいことは Authy 任せ
● Google Authenticator
○ TOTP (Time-based One Time Password, RFC6238) に準拠している
アプリであれば、他でも良い
○ 費用がかからない
○ Google Authenticator と秘密鍵を共有する必要(共有方法がアプリ依存)
二要素認証の設定の流れ
流れは、パスワード認証と同じ。事前に、二要素認証の設定。
あなたの Web サービス
ユーザの作成
メールアドレス
電話番号
二要素認証
の設定
Authy
スマホに Authy アプリのインストール
および Authy との連携設定
Authy へユーザを登録する Java プログラム
String email = "メールアドレス";
String number = "電話番号";
AuthyApiClient client = new AuthyApiClient("Authy で発行したAPIキー");
Users users = client.getUsers();
// ユーザ登録。すでに登録されていても、失敗しない。
User user = users.createUser(email, number, "81");
if (user.isOk()) {
// 成功した場合、ユーザの Authy ID をシステムに保存しておく。
saveUser(email, user.getId());
} else {
認証の流れ
1ステップ目(通常は ID / パスワード) のチェック完了後、
2ステップ目のコード入力を求められると...
あなたの Web サービス
コードの確認
ユーザID
コード
コードを入力
Authy
アプリで
コードを確認
コードが正しいことを確認する Java プログラム
String email = "メールアドレス";
int id = loadUser(email); // システムに保存しているユーザの Authy ID を検索
String code = "ユーザが入力したコード";
AuthyApiClient client = new AuthyApiClient("Authy で発行したAPIキー");
Token token = client.getTokens().verify(id, code); // コードの正常性を確認
if (token.isOk()) {
// コードが正常である場合、ログイン処理を進める
} else {
// コードが正常でない場合の処理
}
Google Authenticator では
ユーザごとに秘密鍵を生成。QRコードを介して秘密鍵を共有。
あなたの Web サービス
秘密鍵の生成・保存
QRコードの表示
二要素認証
の設定
スマホに Google Authenticator のインストール
QRコードから秘密鍵を読み込み
秘密鍵を生成する Java プログラム
https://github.com/wstrange/GoogleAuth のライブラリを拝借
String email = "メールアドレス。ID として利用。";
GoogleAuthenticator gAuth = new GoogleAuthenticator();
GoogleAuthenticatorKey key = gAuth.createCredentials(); // 秘密鍵を生成
saveKey(email, key.getKey()); // 秘密鍵をシステムに保存
// Google Chart API で QR コードを表示する URL を生成
String url = GoogleAuthenticatorQRGenerator
.getOtpAuthURL("MIJS", email, key);
認証の流れ
1ステップ目(通常は ID / パスワード) のチェック完了後、
2ステップ目のコード入力を求められると...
あなたの Web サービス
ユーザ ID から秘密鍵を検索
秘密鍵からコードの正当性を確認
コードを入力
アプリで
コードを確認
コードが正しいことを確認する Java プログラム
String email = "メールアドレス。ID として利用。";
int code = "ユーザが入力したコード";
String key = loadUser(email); // 秘密鍵を検索
GoogleAuthenticator gAuth = new GoogleAuthenticator();
if (gAuth.authorize(key, code)) { // コードの正常性を確認
// コードが正常である場合、ログイン処理を進める
} else {
// コードが正常でない場合の処理
}
まとめ
二要素認証、特にスマホを用いた二要素認証は
実用段階
Authy / Google Authenticator を用いた
二要素認証の実現について紹介

二要素認証を実現する