TOTP
RFC 6238 TOTP: TimeBbased One-Time Password Algorithm
https://datatracker.ietf.org/doc/html/rfc6238
https://tex2e.github.io/rfc-translater/html/rfc6238.html
付録B テストベクトル SHA256, SHA512 は共有シークレット記載漏れあり ハッシュ長と同じになる32バイトと64バイトまで拡張すると結果と一致する (ブロック長ではないらしい)
RFC 4226 HOTP: An HMAC-based one-time password algorithm
https://tex2e.github.io/rfc-translater/html/rfc4226.html
RFC 6030 Portable Symmetric Key Container (PSKC)
https://tex2e.github.io/rfc-translater/html/rfc6030.html
RFC 6063 Dynamic Symmetric Key Provisioning Protocol (DSKPP)
2要素認証(2FA), 多要素認証(MFA)のひとつ HMACと時間ベースで認証する
基本的にパスワードなどと組み合わせて利用する
なくした場合のために他のアカウント回復手段が必要
PasskeyなどFIDO2, WebAuthnに移行したほうがいいのかも
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 これ
hotp もある HOTP
らべる
ABNF表記で次のような感じ
code:label.abnf
label = accountname / issuer (":" / "%3A") *"%20" accountname
code:label.abnf
label = issuer (":" / "%3A") *"%20" accountname
でいいんじゃないのかな
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のみが多い?)
MD5 廃止?
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)にしてもよさそう。認証アプリ側は未対応かもしれず。
URI表記のほか、QRコードにできるということはNFCタグにもできたりできなかったり
同じシークレットでの発行は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の桁数を取り出したもの
OTP
OATH (initiative for open authentication) https://openauthentication.org/ で作ったらしい
Google Authenticator otpauth URI
https://github.com/google/google-authenticator/wiki/Key-Uri-Format
IIJ SmartKey 仕様
https://www1.auth.iij.jp/smartkey/uri_v2.html
あぷり
Google Authenticator (Google認証システム)
https://support.google.com/accounts/answer/1066447?hl=ja
https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2&pcampaignid=web_share
IIJ SmartKey
https://www.iij.ad.jp/smartkey/
https://play.google.com/store/apps/details?id=jp.ad.iij.smartkey2
FreeOTP (RedHat)
https://freeotp.github.io/
https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp&pcampaignid=web_share
Twilio Authy Authenticator
https://www.authy.com/
https://play.google.com/store/apps/details?id=com.authy.authy
Microsoft Authenticator ?
https://www.microsoft.com/ja-jp/security/mobile-authenticator-app
https://play.google.com/store/apps/details?id=com.azure.authenticator
TOTP Java で書いてみる
https://github.com/okomeki/SoftLibCrypto/blob/master/src/main/java/net/siisise/security/otp/TOTP.java