Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TOTP(Time-based One-Time Password) を コマンドラインで実行...

TOTP(Time-based One-Time Password) を コマンドラインで実行してみる #ツナギメオフライン.10

ツナギメオフライン ベンキョウカイ #10で発表したスライドです。

Avatar for akase244

akase244

October 28, 2026

More Decks by akase244

Other Decks in Programming

Transcript

  1. 使ってますよね? • Google Authenticator • Microsoft Authenticator • Authy •

    IIJ SmartKey • Salesforce Authenticator • Proton Authenticator • 2FAS • Aegis Authenticator • Ente Auth
  2. 秘密鍵を発行 $ head -c 20 /dev/urandom | base32 ALSME24I5WMYSMQR2LFNVJJP5P3I3IIY •

    20バイトのランダムな値をBase32文字列に変換
  3. ワンタイムパスワードをワンライナーで発行 h=hmac.new(s,struct.pack(">Q",c),hashlib.sha1).digest (); • hmac.new で HMAC-SHA1 を計算 ◦ s:秘密鍵のバイト列

    ◦ struct.pack(">Q",c):「カウンター(c)」を8バイトのバイト列に変換 ▪ >:ビッグエンディアン ▪ Q:符号なし64ビット整数 ◦ hashlib.sha1:使用するハッシュ関数 • .digest():計算結果をバイト列として取得
  4. 無限ループさせつつ30秒に1回ターミナルで実行してみると? $ while :; do python3 -c 'import hmac,hashlib,struct,time,base64; s=base64.b32decode("ALSME24I5WMYSMQR2LFNVJJP5P3I3IIY"

    ); c=int(time.time())//30; h=hmac.new(s,struct.pack(">Q",c),hashlib.sha1).digest (); o=h[-1]&15; n=int.from_bytes(h[o:o+4],"big")&0x7fffffff; print("%06d"%(n%1000000))'; sleep $((30 - $(date +%s) % 30)); done