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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
Atomic Design, Enforced: Scaling Mobile Design Systems (next.app devCon / droidCon Berlin 2026)
steliosf
PRO
0
180
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
4
3.2k
Jetpack Compose Mechanisms
skydoves
3
870
Apple Intelligenceとオンデバイス時代の到来
yahir0
0
140
AI主導のプログラミング学習アプリを作ってみた
econanringo
0
190
graphql-ruby を Spinel で速くしようとした話
mtsmfm
0
120
[Dev Group Paris Octobre 26] Agentforce, SIforce, Claudeforce, Slackbot… on s'y retrouve ?
nabondance
0
120
Next.js: The final boss of Web Performance
guaca
0
340
Agentic Software Factoryに、すごく賢いIF文を。 / super smart IF statement into the Agentic Software Factory.
rkaga
8
2.4k
最近”作らせてる” ローカルAIアプリの話
akit37
0
500
AI時代のシニアエンジニアとは
yosuke_furukawa
PRO
11
9.3k
全ての永続トークンを、生まれる前に消し去りたい!
sylph01
2
1.4k
Featured
See All Featured
Documentation Writing (for coders)
carmenintech
77
5.6k
The Language of Interfaces
destraynor
162
27k
Chasing Engaging Ingredients in Design
codingconduct
0
370
brightonSEO & MeasureFest 2025 - Winning Strategies for Black Friday CRO & PPC - Christian Goodrich
cargoodrich
3
880
Docker and Python
trallard
47
4.2k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
2
6.3k
Navigating Algorithm Shifts & AI Overviews - #SMXNext
aleyda
1
1.7k
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
12k
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.6k
My Coaching Mixtape
mlcsv
0
360
The Cost Of JavaScript in 2023
addyosmani
55
10k
Reality Check: Gamification 10 Years Later
codingconduct
0
2.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!!