ホームページ制作/SEO対策なら株式会社サイバーブレーンへ

 03-5961-5681 平日10:00~19:00

 2017-10-11

PHPで2要素認証を超簡単に実装する方法

近年、Google アカウントやApple IDを使用して各サービスにログインする際、2要素認証(2ファクタ認証など)という文字列を目にする機会が増えていませんでしょうか。既に利用されている方も多いと思いますが、各サービスにログインする際、IDとパスワードに加えて登録電話番号宛に音声やショートメッセージに謎の番号が届き、その番号を入力してログインに成功するというあれです。

セキュリティへの意識が高まる近年、大手サービスのみならず自社システムへのログインにも2要素認証を導入したいというクライアントが増えてきました。リアルなシステムに2要素認証を組み込むにはそれなりの工数がかかりますが、今回は2要素認証をPHPで実装する際の基本的な方法を超簡単にご説明したいと思います。

2要素認証とは

通常のIDとパスワードの認証は、入力されたそれがサーバ側に保存されているものと同じかどうかを単純に比較(1要素目の認証)しているので、当然のことながらIDとパスワードが他人に知られないよう定期的にパスワードを変更するなどの努力が必要です。この1要素の認証でもIDやパスワードを長くすることなどである程度のセキュリティは確保できると思いますが、さらに2要素目の認証を加えることで強固な認証にするというものであり、2要素目の認証として良く使われるのが、TOTP(Time-Based One-Time Password Algorithm)というものです。

TOTP(Time-Based One-Time Password Algorithm)とは

その名の通りワンタイムパスワードというもので、ある一定時間のみ有効なパスワードです。ユーザー側とサーバ側で同じ「キー」を持ち、そのキーと「時間」からある計算によって弾き出された「答え」がワンタイムパスワードになります。同じキーと同じ時間を使うことで計算結果の答えも同じになるわけですね。

※当然のことながら、キーは他人に知られてはならず、ユーザー側とサーバ側で時間が合っていなければ、答えは異なり、セキュリティの確保も認証も行えません

今回紹介する2要素認証について

Google アカウントの2要素認証は、2要素目の「答え」がショートメッセージで送られてくる電話番号登録の他に、「Google Authenticator」という専用アプリで画面上のQRコードをスキャンすることで「答え」が得られる方法がありますが、今回は後者の方法をご紹介します。

PHPで2要素認証を実装するために必要なもの

[ユーザー側]
Google Authenticatorアプリ
https://itunes.apple.com/jp/app/google-authenticator/id388497605?mt=8 (ios)
https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&hl=ja (android)

[サーバ側]
Google認証PHPライブラリ
https://github.com/PHPGangsta/GoogleAuthenticator

以上!

サーバ側の実装

githubからリポジトリをクローンもしくは直接ダウンロードしても結構ですが、必要なファイルは下記のみです。

PHPGangsta/GoogleAuthenticator.php

このファイルと下記sample.php(何でも結構)を適当な場所に配置して、ブラウザでアクセスしてください。

<?php
require_once 'PHPGangsta/GoogleAuthenticator.php';

$ga = new PHPGangsta_GoogleAuthenticator();
$secret = $ga->createSecret();
echo "Secret is: ".$secret."<br>";

$qrCodeUrl = $ga->getQRCodeGoogleUrl('Blog', $secret);
echo "Google Charts URL for the QR-Code: ".$qrCodeUrl."<br>";

$oneCode = $ga->getCode($secret);
echo "Checking Code '$oneCode' and Secret '$secret':<br>";

$checkResult = $ga->verifyCode($secret, $oneCode, 2);    // 2 = 2*30sec clock tolerance
if ($checkResult) {
   	echo 'OK';
} else {
   	echo 'FAILED';
}

成功すれば、下記3つの情報が表示されていると思います。

Secret is: キー
これが先述の「キー」になります。サーバ側とユーザー側で同じものを持つ必要があります。

Google Charts URL for the QR-Code: QRコード
Google Authenticatorアプリで読み込むQRコードです。パラメーター内に「キー」が含まれていることからもわかる通り、これでユーザー側もサーバ側と同じ「キー」をもつことができるというわけです。

Checking Code '答え'
これが先述の「答え」になります。

ここまでくればもう察しがつくと思いますが、自前のシステムで2要素認証を有効にする際には、このプログラムを裏で実行、画面上にQRコードを表示、ユーザーがアプリでQRコードをスキャン、表示された答えを画面上に入力、サーバ側で「答え合わせ」、答えが合えば認証OKということで「キー」をDBに保存、毎度2要素認証が面倒な場合にはcookieで制御、以上!

最後の方が駆け足気味ですが、以上、「PHPで2要素認証を超簡単に実装する方法」でした!

~この記事の著者~

セキュリティ対策に関するご相談はこちら

 03-5961-5681 平日10:00~19:00

メールフォーム

あなたが
サイトに
求める要素
あなたがサイトに求める0要素