本ドキュメントは、アプリケーション間でのデータ移行における暗号化方式の技術仕様を定義します。TOTP(Time-based One-Time Password)とPINを組み合わせた鍵導出により、時間同期型の安全なデータ転送を実現します。
- 暗号化ライブラリ: Google Tink
- 暗号化アルゴリズム: AES-256-GCM
- 鍵導出関数: SHA3-256
- 認証方式: TOTP (RFC 6238準拠)
- 時間ステップ: 30秒
- 鍵長: 256ビット (AES-256)
- 認証タグ長: 128ビット (GCMデフォルト)
- IV長: 96ビット (Tinkが自動生成)
- ハッシュ関数: SHA3-256 (鍵導出用)
入力:
- PIN: ユーザーが設定する暗証番号
- TOTP: 現在の時刻から生成される6桁のコード
処理:
-
PINとTOTPを文字列連結: PIN || TOTP 例: PIN="00000000", TOTP="135125" → "00000000135125"
-
SHA3-256でハッシュ化: Key1 = SHA3-256(PIN || TOTP)
-
Argon 2でKDF処理 Key-main =Argon2(Key1)
出力:
- 256ビット暗号鍵
- シード: 移行元と移行先で事前共有
- 時間窓: 30秒
- コード長: 6桁
- アルゴリズム: HMAC-SHA256(TOTP標準)
- 生成タイミング: TOTP更新時(30秒ごと)
- 使用期間: 最大30秒
- 保存: 一切保存しない(メモリ上のみ)
- 破棄条件:
- 30秒経過時
- 新しいTOTPコードが生成された時
- 復号処理が成功した時
- 破棄方法: メモリからの安全な削除(ゼロ化推奨)
- 再生成停止: 復号処理の確認が取れた場合、鍵生成を停止
- ユーザーがPINを設定
- TOTP更新を監視(30秒ごと)
- TOTP更新時の処理:
- 既存の暗号鍵を即座に破棄
- 新しい鍵を生成:
Argon2(SHA3-256(PIN || 新TOTP)) - データをTink AES-GCMで暗号化
- QRコードを生成・表示
- 手順3を30秒ごとに繰り返す
- ユーザーが移行元と同じPINを入力
- TOTP更新を監視(30秒ごと)
- TOTP更新時の処理:
- 既存の暗号鍵を破棄
- 新しい鍵を生成:
Argon2(SHA3-256(PIN || 新TOTP))
- QRコードをスキャン
- Tink AES-GCMで復号化
- 復号成功時、インポート完了を表示
QRコード内容 = Base64(Tink暗号化出力)
Tink暗号化出力の構造: [Tinkヘッダー][IV (96ビット)][暗号文][認証タグ (128ビット)]
- 形式: Base64エンコード
- 文字セット: 標準Base64(A-Z, a-z, 0-9, +, /)
- アカウント情報
- アプリケーション設定
- ユーザーデータ
- その他移行が必要なデータ
- 最小長: 8文字推奨
- 文字種: 数字、英字、記号の組み合わせ推奨
- 強度: アプリケーションポリシーに従う
- 必須条件: 移行元と移行先のデバイスが正確な時刻を保持
- 許容誤差: ±30秒以内(TOTP 1周期)
- 推奨: NTP等による時刻同期
- 中間者攻撃: QRコードの物理的な読み取りのみ許可
- リプレイ攻撃: 30秒ごとに鍵が変更されるため無効化
- ブルートフォース: TOTP + PINの組み合わせにより困難
- 鍵の漏洩: 鍵を保存せず、使用後即座に破棄
- 転送中: QRコードによる物理的な転送(ネットワーク経由なし)
- 保存: 暗号鍵は一切保存しない
- 認証: GCMモードによる完全性と真正性の保証
TOTP切り替わりタイミングの場合:
- TOTPでのみ試行
- 最大3回のリトライ
PIN間違いの場合:
- エラーメッセージを表示
- 再入力を促す
- (オプション)一定回数失敗でロックアウト
QRコード読み取り失敗:
- 再スキャンを促す
- カメラ権限の確認
時刻同期エラー:
- デバイスの時刻設定確認を促す
- NTP同期を推奨
- QRコード表示: 30秒ごとに自動更新
- スキャン猶予: ユーザーに残り時間を表示
- 復号タイムアウト: 処理開始から5秒以内
pseudocode // 移行元(暗号化) function encryptData(plaintext, pin, totpCode): key = SHA3_256(pin + totpCode) aead = TinkAesGcm(key) ciphertext = aead.encrypt(plaintext, associatedData="") qrCode = Base64Encode(ciphertext) return qrCode
// 移行先(復号化) function decryptData(qrCode, pin, totpCode): ciphertext = Base64Decode(qrCode) key = SHA3_256(pin + totpCode) aead = TinkAesGcm(key) plaintext = aead.decrypt(ciphertext, associatedData="") return plaintext
- Google Tinkバージョン: 最新安定版
- 対応プラットフォーム: iOS, Android, その他Tink対応環境
- 最小要件:
- カメラ機能
- 正確な時刻取得機能
- セキュアな乱数生成器
- アプリを開く
- データ移行機能を選択
- TOTPのQRコードをスキャン(カメラ権限: 一度きりのみ)
- TOTPを移行先デバイスに入力して認証
- 認証完了ボタンをタップ
- PINを設定(8文字以上推奨)
- QRコードが表示される(30秒ごとに自動更新)
- アプリを開く
- データ移行をタップ
- 移行元で設定したPINを入力
- 「QRコードをスキャン」ボタンをタップ
- 移行元デバイスのQRコードを読み込む
- 復号化処理が自動実行
- 「インポート完了」メッセージを確認
- 残り時間表示: QRコード更新までのカウントダウン
- 進捗表示: 「暗号化中」「復号化中」の明示
- エラーメッセージ: 分かりやすい日本語での説明
- ヘルプ: 「30秒以内にスキャンしてください」等の案内
- TOTP: Time-based One-Time Password(時間ベースのワンタイムパスワード)
- PIN: Personal Identification Number(個人識別番号)
- AES-GCM: Advanced Encryption Standard - Galois/Counter Mode
- IV: Initialization Vector(初期化ベクトル)
- SHA3: Secure Hash Algorithm 3
- RFC 6238: TOTP: Time-Based One-Time Password Algorithm
- NIST SP 800-38D: Recommendation for Block Cipher Modes of Operation (GCM)
- Google Tink公式ドキュメント: https://github.com/google/tink
| バージョン | 日付 | 変更内容 |
|---|---|---|
| 1.0 | 2026-01-01 | 初版作成 |
| 1.0.1 | 2026-01-08 | 鍵生成に関する訂正 |
注意事項: 本仕様書は技術的な実装詳細を提供するものであり、実際の実装においてはセキュリティ監査を受けることを強く推奨します。