TOTP
RFC 6238 TOTP: TimeBbased One-Time Password Algorithm
付録B テストベクトル SHA256, SHA512 は共有シークレット記載漏れあり ハッシュ長と同じになる32バイトと64バイトまで拡張すると結果と一致する (ブロック長ではないらしい)
RFC 4226 HOTP: An HMAC-based one-time password algorithm
RFC 6030 Portable Symmetric Key Container (PSKC)
RFC 6063 Dynamic Symmetric Key Provisioning Protocol (DSKPP)
2要素認証(2FA), 多要素認証(MFA)のひとつ HMACと時間ベースで認証する
基本的にパスワードなどと組み合わせて利用する
なくした場合のために他のアカウント回復手段が必要
HOTP に初期時間との差などをパラメータとして出てくる数字 時計が正確(30秒間隔程度)であること
二要素目の認証ぐらいに使える
QRコードで指定されることが多いが最小限必要なsecretを控えておけばいい otpauth
TOTPに必要な設定を詰め込んだURI
otpauth://<type>/<label>?<parameters>
亜種(Y!Japan 廃止済み?)
yjotp://totp/<label>?<parameters>
label accountnameのみ?
parameters secretのみ?
例
otpauth://totp/SiisiseNet:abc@example.jp?secret=GEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZDGNBVGY3TQOJQGEZA&issuer=SiisiseNet&algorithm=SHA256&digits=8
type
totp これ
らべる
code:label.abnf
label = accountname / issuer (":" / "%3A") *"%20" accountname
code:label.abnf
でいいんじゃないのかな
accountname URI符号化 な名前 (":" および "%3A" を含まない)
email address など
issuer 発行者識別子 URI符号化な名前 (":" および "%3A" を含まない)
accountname 、 issuer 共に RFC 3984 URI segment または pchar を基準にエスケープすればよさそう @はエスケープしなくていい
どちらも? ":" コロンまたはそれを符号化した "%3A" を含むことはできない
パラメータ
secret 秘密鍵 BASE32 符号化 (必須、= padding なし、利用者の鍵になるもの、ハッシュ以上ブロックサイズ以下) SHA1 160bit以上512bitぐらいまで
SHA224 224bit以上512bitぐらいまで
SHA256 256bit以上512bitぐらいまで
SHA384 384bit以上1024bitぐらいまで
SHA512 512bit以上1024bitぐらいまで
SHA3-224 224bit以上1152bitぐらいまで
SHA3-256 256bit以上1088bitぐらいまで
SHA3-384 384bit以上832bitぐらいまで
SHA3-512 512bit以上576bitぐらいまで
SHAKE128 256bit以上1344bit ぐらいまで
SHAKE256 512bit以上1088bitぐらいまで
issuer 発行者名 ラベルのものと同じ (必須 こちらが優先?)
algorithm ハッシュアルゴリズム (HOTPで詳細が未定義なのでSHA1のみが多い?)
SHA224 仕様なし?
SHA256 仕様あり
SHA384 仕様なし?
SHA512 仕様あり
SHA3-224 仕様なし?
SHA3-256 仕様なし?
SHA3-384 仕様なし?
SHA3-512 仕様なし?
SHAKE128 (256bit hash) 仕様なし? SHAKE256 (512bit hash) 仕様なし?
digits 桁数 6 でふぉると 最大 8から9 くらいまで考慮しておくといいかも
period X タイムステップ秒間隔 でふぉると 30 (無効? 使われていない IIJ では10以上)
icon Microsoft (とIIJ?)のが対応しているらしいが例がみつからない
secretの鍵長はHMACの制約でハッシュ長を目安に、ハッシュ関数のブロックサイズまでの長さで作る。
algorithm はSHA1が標準だがSHA2、SHA3(SHAKE128/SHAKE256)にしてもよさそう。認証アプリ側は未対応かもしれず。
同じシークレットでの発行は1度にすること、再発行の際には別のシークレットを発行し、TOTPチェック後、古いものを無効にする。
Unixのエポックタイムと呼ばれる時間からの経過秒数 ÷ period を 64bit な long型っぽい数値でsecret とalgorithm なHOTPにかけたもの
issuer や label は表示用
K = secret からBase32 decodeで取り出した鍵
C = time / period (秒) の64bit値
H = HOTP(K, C) // HMACの値を4バイト数値(int)に変換する
Hから10進でdigitsの桁数を取り出したもの
Google Authenticator otpauth URI IIJ SmartKey 仕様
あぷり
Google Authenticator (Google認証システム)
IIJ SmartKey
FreeOTP (RedHat)
Twilio Authy Authenticator
Microsoft Authenticator ?
TOTP Java で書いてみる