二段階認証を実装するにあたり、自分が調べたことをまとめました。
何か間違ったことがあれば、コメントいただけると幸いです!
二段階認証?二要素認証
英語では、二段階認証を「Two-Factor-Auth」と訳しますが、日本語では「二段階認証」と「二要素認証」は明確に異なります。
二段階認証の説明をする前に、認証の3要素について説明する必要があります。
認証の三要素
私たちが普段Webサービスを利用する際に、アカウントが自分のものか、認証を行います。その代表的な手段として「メールアドレス」と「パスワード」が一般的です。ですが、一個人を特定する方法として、他にも種類があります。それらを3つに分類したものを「認証の3要素」と呼んだりします。以下のように分けられます。
ユーザが知っていること(知識情報)
ID・パスワード
秘密の質問
ユーザが持っているもの(所持情報)
電話番号
キャッシュカード
ワンタイムパスワード用トークン(ハードウェア・ソフトウェア)
ユーザ自身の特徴(生体情報)
指紋認証
顔認証
結局どう違うの?
認証の3要素を用いて、一個人を特定することは変わりません。ただ、認証の回数や認証要素の数で変化します。以下が違いとなります。
二段階認証
認証回数を2回以上
に分ける認証方法を表します。極端なことを言えば、
一回目:メールとパスワードで認証、二回目:メールとパスワードで認証
でもOK。ただ、そんなザルな認証方法はないので、二回目の認証をSMSでの認証を行うことがよくみられる実装です。
二要素認証
認証要素を2つ以上組み合わせる
認証方法を表します。例えば、ATMで現金を引出す際に、キャッシュカードと指紋認証で認証を行なった場合、二要素認証となります。
※二回目の認証をSMSで認証を行なった場合、二段階認証でありかつ二要素認証となります。
それでは、次に二段階認証でよく用いられるワンタイムパスワードについて説明します。
ワンタイムパスワード(OTP)の仕様について
ワンタイムパスワード(以下、OTP)の仕様については、独自で決めるのではなく、IETFのRFCに仕様がまとまっており、それに準拠して実装を行う。
OTPの生成方法は大きく二つある
HOTP (HMAC-Based One-Time Password)
秘密鍵と認証回数を用いて計算し、OTPを生成する。認証回数をクライアントとサーバーで保持しており、認証回数が変わることで、OTPも変更となる。つまり、OTPを使用しなければ、OTPが変わることはない。
HOTPを求めるには以下の計算式を用いる。
HOTP(K, C) = Truncate(HMAC-SHA-1(K,C))
K... 秘密鍵
C... 変動する値 =>認証回数を用いることが多い
HOTPでのデータのやりとり
TOTP (Time-Based One-Time Password)
認証回数と秘密鍵を用いて、HOTPを計算した。RFCでは、認証回数を時間に変更して計算したものを、TOTPと定義している。つまり、計算式は下記のように整理される。
TOTP(K, T) = HOTP(K, C)
HOTP(K, T) = Truncate(HMAC-SHA-1(K,T))
T = (Current Unix Time - T0) / X
X...TOTPを再生成するまでの時間
T0...数え始めの時間(Unix時間を使うのが通常なので、0がデフォルト)
TOTPでのデータのやりとり
[参考]用語の整理
・HMAC(Hash-based Message Authentication Code)...ハッシュ関数を組み合わせたメッセージ認証符号の一つで、秘密鍵とメッセージ(データ)とハッシュ関数を用いてい計算する。
※組み合わせるハッシュ関数によって、HMAC-XXXと表示を分ける。
[参考]RFCとは
RFCとは、インターネット技術の標準化などを行うIETF(Internet Engineering Task Force)が発行している、技術仕様などについての文書群。
TCP/IP関連のプロトコル(通信規約)の標準仕様などが記されたもので、インターネット上で公開されており誰でも入手・閲覧することができる。
参考URL
「二要素認証」と「二段階認証」の違い
RFC6238: TOTP: Time-Based One-Time Password Algorithm
RFC4226:HOTP: An HMAC-Based One-Time Password Algorithm
TOTPを実装する
RFC6238 Time-based One-time Password Algorithm (TOTP)の仕組みのメモ
Time-based One-time Password algorithm