京都大学の多要素認証(2段階認証)では、ログイン時にワンタイムパスワード(OTP)の入力が求められます。KULMS+ に TOTP シークレットキーを登録しておくことで、この OTP 入力を自動化できます。
仕組み
KULMS+ は RFC 6238(TOTP)に基づき、登録済みのシークレットキーと現在時刻から 30 秒ごとに変化する 6 桁のワンタイムパスワードを端末内で生成します。Google Authenticator 等の認証アプリと同じ標準仕様です。
シークレットキーは各プラットフォームのセキュアストレージに暗号化して保存され、外部に送信されることはありません。
設定手順
方法 A: 自動登録(推奨)
KULMS+ v1.18.0 以降では、京大の TOTP 登録ページにアクセスするだけで、シークレットの保存と OTP の入力が自動で行われます。
- 京大の多要素認証設定ページ(統合認証システム → ワンタイムパスワードの設定 → アプリ)にアクセスします。
- KULMS+ が QR コードからシークレットキーを自動読み取りし、拡張機能に保存します。同時に OTP コードを生成してフォームに自動入力します。
- 内容を確認し、「登録」ボタンをクリックして完了です。
方法 B: 手動登録
自動登録がうまくいかない場合や、既にシークレットキーを持っている場合はポップアップから手動で設定できます。
- 京大の多要素認証設定ページで QR コードを表示します。
- KULMS+ のポップアップを開き、下部の「TOTP 自動入力」セクションを展開します。
- 「ページからスキャン」ボタンをクリックすると、ページ上の QR コードからシークレットキーが自動入力されます。手動で Base32 シークレットキーを貼り付けることもできます。
- 「保存」をクリックします。
- 認証設定ページ上で、認証アプリ(Google Authenticator 等)に表示された OTP をフォームに入力し、「登録」をクリックして京大側の登録を完了します。
QR コードを読み込んだだけでは京大側の登録は完了しません。シークレットキー保存後、必ず OTP を入力して「登録」ボタンをクリックしてください。方法 A では OTP の自動入力まで行われるため、「登録」をクリックするだけで完了します。
コードの確認と QR 生成
設定済みの TOTP シークレットキーに関する確認・管理機能がポップアップに用意されています。
- 「コードを表示」ボタン — 現在の 6 桁 OTP コード(30 秒カウントダウン付き)と、保存済みのシークレットキーを表示します。認証アプリの表示と一致するか確認できます。
- 「QR」ボタン — 保存済みシークレットから
otpauth://形式の QR コードを生成します。モバイル端末の認証アプリ(Google Authenticator 等)でスキャンして追加登録できます。
シークレットキーの登録
方法 A: QR コードをスキャン(推奨)
- KULMS+ モバイル版のログイン画面で「QR コードをスキャン」をタップします。
- QR コードをカメラで読み取ります。QR コードは以下のいずれかから取得できます。
- KULMS+ 拡張機能のポップアップ — TOTP 設定済みの場合、「QR」ボタンで QR コードを生成できます。PC の画面に表示された QR をモバイルで読み取るだけで完了です。
- 京大の多要素認証設定ページ — 初回登録時に表示される QR コードを直接読み取ります。
- 保存すると、次回ログインから OTP が自動入力されます。
方法 B: 手動入力
- KULMS+ モバイル版のログイン画面で「TOTP シークレットキー」入力欄に Base32 形式のシークレットキーを入力します。
- 「保存」をタップして完了です。
コードの確認
シークレットキー設定済みの状態で「現在のコードを表示」ボタンをタップすると、現在の 6 桁 OTP コード(30 秒カウントダウン付き)と保存済みのシークレットキーが表示されます。認証アプリの表示と一致するか確認できます。
京大側の登録
初めて TOTP を設定する場合は、京大の認証設定ページ上で OTP を一度入力して登録を完了する必要があります。モバイル版では自動登録機能がないため、以下の手順で行ってください。
- 京大の多要素認証設定ページにアクセスします(PC のブラウザを推奨)。
- QR コードを認証アプリ(Google Authenticator 等)または KULMS+ モバイル版で読み取ります。
- アプリに表示された 6 桁の OTP をフォームに入力し、「登録」をクリックして完了です。
セキュリティについて
シークレットキーの保存先
TOTP シークレットキーは、各プラットフォームのセキュアストレージに暗号化して保存されます。「コードを表示」や「QR」ボタンで表示される際は、その場で復号されて表示されます。
- ブラウザ拡張機能 —
chrome.storage.localに AES-256-GCM で暗号化して保存。暗号鍵は IndexedDB に保持(非抽出)。 - iOS — iOS Keychain(OS 管理の暗号化)
- Android — Android Keystore + SharedPreferences(AES-256-GCM、ハードウェア管理鍵)
ご注意
パスワードと TOTP シークレットキーを同一端末に保存する場合、厳密には 2 つの認証要素が 1 つの端末に集約されるため、「完全な 2 要素認証」ではなくなります。これは 1Password や Bitwarden 等の主要なパスワードマネージャーが TOTP 機能を提供する場合と同様のトレードオフです。
セキュリティを最重視する場合は、TOTP シークレットキーを KULMS+ に登録せず、別端末の認証アプリ(Google Authenticator 等)をご利用ください。
FIDO認証(パスキー)という選択肢
京大の2段階認証は TOTP のほかに FIDO認証(パスキー)にも対応しています。セキュリティキーや生体認証(指紋・顔認証)を登録すれば、パスワード+ワンタイムパスワードの入力なしでログインできます。
TOTP の自動入力で十分便利ですが、FIDO認証なら端末側の認証だけで完結するため、さらにスムーズかつ安全です。
FIDO認証の設定方法
- auth.iimc.kyoto-u.ac.jp/user/ にログインします。
- 右上のハンバーガーメニュー →「FIDO認証デバイスの設定」を開きます。
- 画面の指示に従ってセキュリティキーまたは生体認証を登録します。
詳しくは 多要素認証について または 設定手順 (PDF) をご覧ください。
よくある質問
「ワンタイムパスワードが異なります」と表示されます
京大の認証サーバーに登録できる TOTP シークレットキーは 1 つだけ です。多要素認証設定ページにアクセスするたびに新しいシークレットキーが発行され、「登録」を完了すると以前のキーは上書きされて無効になります。
よくある原因:
- KULMS+ の設定後に、Google Authenticator 等で多要素認証設定ページを開いて再登録した — 京大サーバーのシークレットキーがその時点で新しく発行されたものに上書きされ、KULMS+ に保存されているキーと一致しなくなっています。
- KULMS+ を設定するために多要素認証設定ページを開いたが、京大側の「登録」ボタンを押さなかった — KULMS+ は表示された QR コードから新しいキーを保存しますが、「登録」を完了しないと京大サーバーには古いキーが残ったままです。KULMS+ が生成する OTP とサーバーが期待する OTP が異なります。
- 複数の端末・アプリでそれぞれ多要素認証設定ページを開いて登録した — 多要素認証設定ページを開くたびに新しいキーが発行されるため、端末ごとに異なるキーが保存されます。最後に「登録」した端末のキーだけが有効です。
解決方法: 多要素認証設定ページを開いて KULMS+ に再登録し、「登録」ボタンを押してください。他の端末にも同じキーを共有するには、多要素認証設定ページを再度開くのではなく、KULMS+ 拡張機能のポップアップにある「QR」ボタンで生成した QR をスキャンしてください。
セキュリティ的に大丈夫ですか?
KULMS+ は以下の方針でシークレットキーを安全に管理しています。
- 端末内完結 — シークレットキーは端末内のセキュアストレージにのみ保存され、KULMS+ の開発者サーバーを含む外部サーバーには一切送信されません。
- 暗号化保存 — ブラウザ拡張機能では AES-256-GCM 暗号化、iOS では Keychain、Android では Keystore + AES-256-GCM でハードウェアレベルの保護がかかります。
- 標準プロトコル — OTP の生成は RFC 6238(TOTP)に準拠しており、独自の認証処理は一切行っていません。
- オープンソース — ソースコードは GitHub で公開されており、動作を誰でも確認できます。
なお、パスワードと TOTP を同一端末に保存する場合、2 つの認証要素が 1 台に集約されるトレードオフがあります。これは 1Password や Bitwarden 等の主要パスワードマネージャーが TOTP 機能を提供する場合と同じ構造です。詳しくは上の「セキュリティについて」セクションをご覧ください。