Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
TOTP(Time-based One-Time Password) を コマンドラインで実行...
Search
akase244
October 28, 2026
Programming
9
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
TOTP(Time-based One-Time Password) を コマンドラインで実行してみる #ツナギメオフライン.10
ツナギメオフライン ベンキョウカイ #10で発表したスライドです。
akase244
October 28, 2026
More Decks by akase244
See All by akase244
【加筆修正版】Laravel のアプリケーションをどこにデプロイするか #phpcon_ehime
akase244
0
160
Laravelのアプリケーションをどこにデプロイするか #ツナギメオフライン.9
akase244
0
160
mkpasswd を再実装したくなったので AIに伴走してもらいながら rekey という パスワードジェネレーターを作ってみた #fukuokago
akase244
0
60
Let’s Encryptのフォールバック先について #ツナギメオフライン.8
akase244
0
82
PHPでローカル環境用のSSL/TLS証明書を発行することはできるのか? #phpconkagawa
akase244
0
680
「Linuxサーバー構築標準教科書」を読んでみた #ツナギメオフライン.7
akase244
0
1.4k
connpassのMCPを作ってみた #ツナギメオフライン.6
akase244
0
93
ローカル環境でSSL/TLS証明書を発行して警告表示を出さないようにするアレコレ #ツナギメオフライン.5
akase244
0
170
GitHub Actionsを使って指定した日時にPull Requestをマージしたい #lydmeet
akase244
0
110
Other Decks in Programming
See All in Programming
なぜCTOを降りてFDEを選んだのか?〜なぜプロダクト企業がFDEで顧客の現場に踏み込むのか〜
gonta
1
240
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
120
オーケストレーション記述言語 Katari
yukikurage
0
200
Domain-Driven Transformation
hschwentner
2
2.3k
気持ちぃ〜角丸 Squircle
ryu1013
0
340
AIで開発が速くなった先で、開発チームは何を目指すか
shihochan
1
1.8k
AI時代のTerminal環境を UNIX哲学で設計・運用する
yasunori0418
1
250
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.4k
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
370
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
310
見えないものを探る要求要件定義に必要な基本的思考 / invisible-requirement-thinking
minodriven
15
8.8k
PumaからFalconに移行したRailsアプリケーションでの実践
falcon8823
0
250
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
371
20k
Odyssey Design
rkendrick25
PRO
2
890
Between Models and Reality
mayunak
4
520
The agentic SEO stack - context over prompts
schlessera
0
980
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Designing for Performance
lara
612
70k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.8k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
580
Self-Hosted WebAssembly Runtime for Runtime-Neutral Checkpoint/Restore in Edge–Cloud Continuum
chikuwait
0
900
Tell your own story through comics
letsgokoyo
1
1.1k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Balancing Empowerment & Direction
lara
6
1.3k
Transcript
ツナギメオフライン ベンキョウカイ #10 TOTP(Time-based One-Time Password) を コマンドラインで実行してみる October 28,
2026.
@akase244 <?php var_dump( (new Me()) ->WebApplicationEngineer() ->InfrastructureEngineer() );
@tsunagimefm https://tsunagi.me/
@tsunagimeoff https://tsunagime-offline.connpass.com/
TOTP を知ってますか?
TOTP のアプリを使ってますか?
使ってますよね? • Google Authenticator • Microsoft Authenticator • Authy •
IIJ SmartKey • Salesforce Authenticator • Proton Authenticator • 2FAS • Aegis Authenticator • Ente Auth
質問 TOTP の仕組みを知ってますか?
疑問に思ったことはありませんか? どの TOTP アプリを使っても 同じパスワードが発行されるのは どうしてだろう?
答えは RFC 6238 に書いてあります https://www.rfc-editor.org/rfc/rfc6238.html
ざっくり説明すると サーバーとTOTPアプリで 同じ秘密鍵を 同じハッシュ方式(デフォルト:HMAC-SHA1)で 同じ時間帯(30秒間隔)に 算出した数値なので一致する
ということで やってみましょう
秘密鍵を発行 $ head -c 20 /dev/urandom | base32 ALSME24I5WMYSMQR2LFNVJJP5P3I3IIY •
20バイトのランダムな値をBase32文字列に変換
ワンタイムパスワードをワンライナーで発行 $ 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))' 696530
ワンタイムパスワードをワンライナーで発行 import hmac,hashlib,struct,time,base64; • 必要なモジュールの読み込み
ワンタイムパスワードをワンライナーで発行 s=base64.b32decode("ALSME24I5WMYSMQR2LFNVJJP5P3I3IIY" ); • Base32文字列を元のバイト列に変換
ワンタイムパスワードをワンライナーで発行 c=int(time.time())//30; • 現在時刻を30秒単位のカウンター(c)に変換
ワンタイムパスワードをワンライナーで発行 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():計算結果をバイト列として取得
ワンタイムパスワードをワンライナーで発行 o=h[-1]&15; • オフセット(HMAC-SHA1 の計算結果から数値を取り出す位置)を取得
ワンタイムパスワードをワンライナーで発行 n=int.from_bytes(h[o:o+4],"big")&0x7fffffff; • h[o:o+4]:HMAC-SHA1 の計算結果をオフセットの位置から4バイト取得 • int.from_bytes(...,"big"):取得した4バイトをビッグエンディアンの整数に変換 • &0x7fffffff;:最上位ビットを0にして、31ビットの非負整数に変換
ワンタイムパスワードをワンライナーで発行 print("%06d"%(n%1000000)) • 6桁で出力
無限ループさせつつ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
30秒毎に同じ値が出力されています
まとめ • TOTPの数値は30秒に1回計算して出力した値 • サーバーとクライアント(アプリ)で同じ計算方法なので値が一致する • 異なるクライアント(アプリ)でも同じ計算方法なので値が一致する • 計算時のハッシュ方式は「HMAC-SHA1」が利用されている
おまけ タイムリミットに間に合わなかった場合でも 認証が通った経験はありませんか?
おまけ サーバーとクライアント(アプリ)で 時刻が同期されていることが前提ですが きっちり30秒ではなく前後にバッファがあり バッファ期間は許容する作りになっています
Thanks! Have a good programming!!