セキュリティ
多層の保管庫が水晶の鍵を守り、周囲の鍵とバックアップ容器が暗号化と安全な復旧を表す。

エンジニアリング · チュートリアル

パスワードマネージャーのおすすめ

パスワードの使い回しから、Vault の暗号化、TOTP、FIDO2、パスキー、自動入力、バックアップまで。図解と展開式の技術補足で整理する。

今ではどのウェブサイトでもアカウントとパスワードが必要ですが、多くの人は同じパスワードを使い回しているのではないでしょうか。

これは危険です。問題は、一つのサイトから情報が漏れると、その認証情報をほかのサイトでも試せてしまうことにあります。

こうした問題への対策として、OTP(面倒だと感じて有効にしない人も少なくありません)に加え、パスワードマネージャーがあります。

Chrome 内蔵の機能をパスワードマネージャーとして使う人も多いでしょう。ただ、別のアプリや、ウェブページ以外でパスワードが必要になったらどうするのでしょうか。

そこで、パスワードマネージャーを紹介したいと思います。

補足すると、Chrome/Google パスワード マネージャーは、一部のモバイル OS ではほかのアプリにもパスワードを入力できます。ウェブ専用というわけではありません。私が重視するのは、デバイスやブラウザーが変わっても一貫した管理方法を使えるかどうかです。[14]

01 /同じパスワードを使い続けてはいけない理由

この攻撃は Credential Stuffing(クレデンシャルスタッフィング) と呼ばれます。攻撃者は各サイトを個別に突破する必要がありません。サイト A から漏れた認証情報の一覧を使い、プログラムで B・C・D に大量のログインを試せます。どこかで同じパスワードを使っていれば、ログインに成功する可能性があります。

パスワードマネージャーは、サイトごとに異なるランダムなパスワードを生成することで、この問題に対処します。例えばランダムな 20 文字の文字列です。人が覚えるのはマネージャーのマスターパスワードだけで、各サイトのパスワードを暗記する必要はありません。サイト A に問題が起きても、そのパスワードをそのままサイト B のログインには使えません。

パスワードの使い回し一か所の漏えいが、ほかのアカウントにも波及する可能性があります。
フィッシングサイト自分でパスワードを入力するよう誘導します。サイトごとに異なるパスワードでも防げるとは限りません。
端末のマルウェア感染使用中の認証情報を読み取られる可能性があり、エンドポイント側の対策が必要です。

つまり、パスワードマネージャーは OTP や FIDO2 の代わりではありません。まず、多数のサイトのパスワードを安全に管理しにくいという問題を解決するものです。

02 /クラウドに保存したパスワードを、なぜ事業者が読めないことがあるのか?

パスワードマネージャーは通常、データを Vault(保管庫) に保存します。デバイス間で同期できますが、重要なのは、自分のデバイスで暗号化し、自分のデバイスで復号することです。サーバーが主に受け取るのは暗号化済みのデータであり、毎回あなたの代わりに金庫を開けるわけではありません。

実際には「マスターパスワードで全データを直接 AES 暗号化」するわけではない

Bitwarden の通常のマスターパスワード方式を例にすると、三つの層に分けられます。まず KDF でマスターパスワードを鍵素材に変換し、その素材で保護された Vault の対称鍵を開きます。最後に Vault の鍵で、保存したサイトのパスワードを復号します。この設計は Key Hierarchy(鍵階層)と呼ばれます。[01]

マスターパスワード、Vault の鍵、サーバーの役割分担KEY HIERARCHY
利用者端末 / LOCAL同期サービス / SERVER
01 · 自分で入力Master Password人が覚えられる秘密
↓ PBKDF2 / Argon2id、HKDF
02 · 導出Stretched Master Key保護済みの鍵を開くために使う
↓ 鍵を取り出す
03 · 取得Vault の対称鍵サイトのパスワードを端末内で復号
← 暗号文を同期← Protected Symmetric Keyサーバー側で平文を復号しない →
Encrypted Vault暗号化されたアカウントデータ
Protected Key端末内で鍵を取り出す必要がある

サーバーにはログインや運用に必要なデータもありますが、Vault の平文を持つこととは別です。

概念図です。実装には各項目の暗号鍵やログイン用ハッシュなども含まれます。すべての製品で同じ鍵名を使うという意味ではありません。[01]

KDF、AES、MFA はそれぞれ何を担当するのか?

KDFマスターパスワードを推測する一回ごとの計算コストを意図的に高めます。弱いパスワード自体を強いものにはできません。
AES + 完全性検証保存済み Vault の内容が直接読まれたり、検知されずに改変されたりすることを防ぎます。
MFA/二段階認証アカウントへのログイン条件を増やしますが、すでに盗まれた暗号文へのオフライン推測は防げません。

「ゼロ知識」を絶対的な安全と理解してはいけません。コンピューターがすでに感染しており、Vault を解除すると、マルウェアは画面、メモリー、入力結果などから情報を取得する可能性があります。クラウド保存データの窃取と、使用中の端末の乗っ取りは異なる脅威です。[01]

攻撃者が入手するもの 役立つ仕組みは? 役立たない仕組みは?
サイト A から漏れた認証情報 サイトごとの固有パスワード、MFA 元のパスワードを一、二文字変えるだけ
クラウド上の暗号化 Vault のコピー 強いマスターパスワード、KDF、鍵の設計 窃取後に有効にしたログイン MFA
ロック解除済みのコンピューター OS 更新、エンドポイント保護、ロックの習慣 クラウドのゼロ知識という説明だけに頼ること
唯一のスマートフォンやセキュリティキーの紛失 オフライン復旧コード、予備キー、検証できるバックアップ 元のスマートフォンだけにバックアップを置くこと

03 /Bitwarden と 1Password は何が違うのか?

私はまず、この二つを検討します。どちらも単にパスワードをクラウドへ保存するだけの製品ではありませんが、「クラウドのバックアップが攻撃者の手に渡る」場面への設計には違いがあります。

Bitwardenオープンソース · クロスプラットフォーム

まずはこちらをおすすめします。無料プランで十分な人も多く、ブラウザー拡張、デスクトップ版、モバイルアプリ、自動入力がそろっています。

ソースの透明性やセルフホストの柔軟性を重視する人は、優先して検討できます。ただしセルフホストでは更新とバックアップを自分で担います。[01]

1Passwordサブスクリプション · 統合された使い勝手

有料でもよければ、こちらもおすすめです。インターフェースの統合が進んでおり、さらに Secret Key によって、サーバー側の漏えい後にマスターパスワードの推測だけで復号されるリスクを下げます。

Secret Key は復旧資料とともに適切に保管する必要があります。[04]

事業者の暗号化データベースがコピーされたと仮定OFFLINE ATTACK
Bitwarden
Vault の暗号文+マスターパスワードを推測→KDF が一回ごとの推測コストを高める
1Password
Vault の暗号文+Account Password を推測+さらに Secret Key が必要

どちらにも強いマスターパスワードは必要です。1Password の Secret Key は「もう一つ暗記するパスワード」ではなく、通常は認証済みデバイスや Emergency Kit に保存します。デバイスも侵害された場合は、脅威モデルが変わります。[04]

Bitwarden は公開ソース、クロスプラットフォームのアプリ、セルフホストの柔軟性を提供します。鍵の流れを理解したい人や、自分で運用を管理したい人には魅力的です。ただし、セルフホストは魔法のような暗号化強化ではありません。TLS、更新、バックアップ、監視、災害復旧は自分の責任になります。[01]

1Password はデバイス上で生成した高エントロピーの Secret Key と Account Password を組み合わせて Vault を保護し、ログイン認証には別途 SRP を使います。主に「サーバー側の情報は漏れたが、攻撃者はデバイス側の秘密を入手できていない」場合に障壁を加えるものです。認証済み端末が感染しても完全に隔離できるという意味ではありません。[04][19]

LastPass は、今のところ最優先の候補にはしません。理由は、2022 年のバックアップ漏えいが長期的なリスクを残しているためです。攻撃者は Vault の暗号文を保存し、将来も弱いマスターパスワードを試し続けられます。全利用者のパスワードが平文で漏れたという意味ではありません。[15]

04 /OTP の 6 桁の数字は、どのように生まれるのか?

多くのサイトでは「OTP を有効にする」として QR コードを読み取り、その後はスマートフォンに一定間隔で新しい 6 桁の数字が表示されます。一般的な方式は TOTP(Time-based One-Time Password) です。サーバーが 30 秒ごとに新しいパスワードをスマートフォンへ送っているわけではありません。[11]

初回設定時にサイトが生成するのは、秘密のシード(Seed)です。QR コードで Authy などの認証アプリに渡した後は、サイトとスマートフォンが同じシードと時間窓を使って、それぞれ計算するため、結果が一致します。ネット接続がなくてもコードを生成できることが多いのは、このためです。

30 秒ごとに新しいパスワードをクラウドから取得するわけではないTOTP / SHARED SECRET
初回設定サイトが秘密のシード K を生成
→ QR コードを読み取る →
自分のスマートフォンAuthy が同じ K を保存
以後のログイン · 両者が別々に計算
WEBSITE / サイト
HMAC(K, 時間窓 T)
482 916
サーバーが独立に計算して照合
=同じ K
同じ T
AUTHENTICATOR / スマートフォン
HMAC(K, 時間窓 T)
482 916
オフラインでもコードを生成
時間窓 T
00–29 秒
30–59 秒
次の 30 秒
時間窓が変わる → 通常はコードも変わる

数値と時間軸は仕組みを説明するためのもので、有効な認証コードではありません。許容する時刻のずれ、HMAC の方式、桁数はサービスによって異なります。[11]

TOTP は「パスワードだけを盗み、スマートフォンやシードは持っていない人」の直接的なログインを防げます。しかし、6 桁の数字は本物のサイトのドメインに結び付いていません。偽のログイン画面にコードを入力すると、攻撃者はすぐに本物のサイトへ転送できる可能性があります。これが、次の節で扱う FIDO2 が対処する問題です。[12]

05 /FIDO2 やパスキーは、なぜ手入力の OTP よりフィッシングに強いのか?

TOTP の 6 桁のコードは、転送できる答えです。FIDO2/WebAuthn は異なります。登録時にセキュリティキーやデバイスが Private Key / Public Key を生成し、サイトは Public Key だけを保存します。ログイン時にはサイトが一回限りの Challenge を発行し、認証器が Private Key で署名して、サイトがそれを検証します。[13]

違いは 6 桁かどうかではなく、転送できるかどうかPHISHING RESISTANCE
TOTP を使用
偽サイト6 桁のコードを取得 →本物のサイト

攻撃者は有効期間内にコードを転送できる可能性があります。

FIDO2/WebAuthn を使用
偽のドメインRP ID が不一致 ×本物のドメインの資格情報

ブラウザーと認証器にはドメインの制約があります。サーバー側でも Origin、Challenge、署名などを検証する必要があります。

ここで説明しているのは、仕様に準拠して正しく実装された WebAuthn ログインです。ログイン済みセッションの窃取は防げず、サイトに残っている弱いアカウント復旧手段も補えません。[12][13]

Passkey は FIDO 資格情報を利用するログイン体験で、通常は従来のサイトのパスワードを入力する必要がありません。パスキーは特定のハードウェアに保持することも、対応するエコシステム内で暗号化して同期することもできます。デバイス紛失時のリスクや復旧方法は、この二つで異なります。

また、YubiKey はハードウェア製品、FIDO2 はプロトコルです。同じ対応セキュリティキーが従来型の OTP、TOTP、FIDO2 をサポートする場合もあります。物理キーを挿しただけで、自動的に WebAuthn のフィッシング耐性を得られるわけではありません。[21]

06 /TOTP は Vault と分けて保管したい

Authy は引き続きおすすめです。また、TOTP と Vault はできるだけ分けたいと考えています。システムだけでなく、可能ならハードウェアのレベルで分離するのが理想です。

これは「アプリが二つなら安全そう」という話ではなく、一つの侵害箇所からパスワードと第二要素の両方を取得されないためです。サイトのパスワードと TOTP のシードを同じ解除済み Vault に保存すると、攻撃者が Vault 全体を読めるようになった時に、両方の秘密を一度に取得する可能性があります。[20]

「分離」を三つの段階に分けて考える

01パスワードと TOTP を同じ Vault に保存

最も便利で、一般的な低リスクのサイトなら必ずしも不合理ではありません。ただし Vault 全体の漏えい時には、両方の秘密が同時に露出する可能性があります。

02別のアプリを使い、TOTP は別のスマートフォンに保存

例えばコンピューターでは Bitwarden、スマートフォンでは Authy を使います。単一の Vault の侵害による波及を減らせますが、バックアップ用アカウントが共通かどうかも確認が必要です。

03独立したハードウェアセキュリティキーを使い、FIDO2 を優先

主要メール、クラウド、金融、管理者アカウントでは、利用できるなら FIDO2 を優先します。紛失時にも復旧できるよう、予備のキーを用意します。

Authy

スマートフォンで TOTP を独立して管理したい人に向いています。バックアップは暗号化して同期できますが、バックアップのパスワードを同じ Vault だけに保存しないでください。[06]

注意点として、Authy の Windows/macOS/Linux デスクトップ版は 2024 年 3 月にサポートを終了しており、現在はモバイルアプリが中心です。予備デバイスを設定した後は、新しいデバイスの追加を許可する Multi-Device を無効にすることが公式に推奨されています。[08] [07]

Authy のバックアップパスワードを Twilio が代わりに保存したり復旧したりすることはありません。バックアップ同期を有効にしたら、バックアップのパスワードを自分で見つけられるようにしておく必要があります。Vault の唯一の復旧手段と同じ場所だけに閉じ込めないでください。Multi-Device による追加を無効にした後も、有効な予備デバイスや復旧経路が残っていることを確認しましょう。[06][07]

2FAS、Aegis、Ente Auth、Yubico Authenticator なども比較する価値があります。ただし選ぶ際に確認したいのは知名度ではなく、シードの保存場所、暗号化バックアップの可否、スマートフォン紛失後の復旧方法、そしてメインの Vault と本当に分離されているかです。

07 /自動入力は便利だが、安全性には境界がある

自動入力は便利な方法です。現状、クリップボードを読み取るアプリも多くあります。

現在の Android/iOS では、クリップボードの読み取りに権限、通知、バックグラウンド制限などが設けられており、すべてのアプリがいつでも盗み見できるわけではありません。それでもパスワードをクリップボードに置くと、露出経路は増えます。OS と統合された自動入力を使えるなら、毎回コピー&ペーストする必要はありません。[10][17]

マネージャーは「今どのサイトを開いているか」をどう判断するのか?

ブラウザー拡張を例にすると、パスワードマネージャーは通常、現在のページの URL/URI を Vault に保存した URL と照合します。Bitwarden の既定の Base domain は多くのサイトに適していますが、Host や Exact を指定して、入力したくないサブドメインにログイン情報が表示されるのを減らすこともできます。[18]

保存した URL の例:https://login.example.com/
Base domain同じ example.com に属する異なるサブドメインが、まとめて一致する場合があります。
Hostホスト名を login.example.com に限定します。
ExactURL 全体の完全一致が必要です。厳密な一方、リダイレクト用パラメーターなどによって一致しない場合もあります。

ただし、「自動入力の候補が表示された」ことは、サイトが信頼できる保証ではありません。サイト自体が侵害されていたり、悪意ある入力欄が存在したりすれば、入力済みのパスワードを読まれる可能性があります。Bitwarden は一部の信頼できない iframe に警告やブロックを行います。そのため私は、「ページの読み込み時に自動入力」を無効にし、必要な時にショートカットキーや手動操作で入力します。[09]

スマートフォンの自動入力は、通常 OS のサービスと、アプリの識別情報や関連ドメインなどを連携させます。デスクトップブラウザーと同じ細かさで URL のパスを判定できるとは限りません。どれほど安全な自動入力でも、悪意あるアプリそのものが安全になるわけではありません。

08 /実際に使い始めるなら、この順番で設定する

  1. 01
    独立した、長く推測しにくいマスターパスワードを設定するほかのサイトと使い回さず、誕生日と固定ルールの組み合わせではなく、ランダムに生成した複数単語のパスフレーズなどを使います。
  2. 02
    よく使うサイトを、一サイト一パスワードにするマネージャーで長いランダムなパスワードを生成します。まずメール、クラウド、金融、パスワードを使い回していたサイトから変更します。
  3. 03
    Vault 自体のログインにも第二要素を追加する対応していれば FIDO2 セキュリティキーを優先し、そうでなければ独立したスマートフォンの TOTP を使います。ログイン対象の Vault の中だけに、唯一の MFA の秘密を保存しないでください。
  4. 04
    自動入力を使いつつ、確認の手順を残すサイトのドメインやアプリを確認し、読み込み直後の自動入力は無効にします。機密性の高いサービスでは、URI の照合を Host または Exact に変更することも検討します。
  5. 05
    基幹となるアカウントに、独立した復旧経路を用意する主要メール、パスワードマネージャー、パスキーの同期アカウントを、相互依存した一つの復旧経路だけに頼らせないようにします。
  6. 06
    暗号化エクスポートをバックアップし、実際に復元を試すBitwarden なら、パスワードで保護した encrypted JSON が選択肢です。添付ファイルは別に扱い、通常の ZIP を暗号化バックアップだと思わないでください。[16]
  7. 07
    OS を更新し、Vault を定期的にロックする不要なブラウザー拡張を減らし、信頼できない共有デバイスでは Vault を解除しないでください。
バックアップを設定する時は「最悪の日」を想像するRECOVERY LOOP
Vault にログインできないTOTP / 復旧コードが必要しかし唯一のコピーは Vault の中循環依存が発生
復旧手段を分けて保管オフライン復旧コード予備の FIDO2 キーや独立したスマートフォン実際に一度、復旧をテストする

09 /さらに技術を知りたい人へ:アルゴリズムを詳しく見る

ここまでは「なぜそうするのか」を説明しました。以下では、実際の鍵の流れ、式、プロトコルの検証、例外条件を扱います。気になる項目を開いて読んでください。

01 · Bitwarden の鍵階層:Master Key から Vault の平文まで

通常のマスターパスワードでログインする Bitwarden アカウントでは、クライアントがマスターパスワードやアカウントのメールアドレスなどを入力に KDF を実行し、Master Key を得ます。さらに HKDF で展開して Stretched Master Key を導出し、サーバーから取得した Protected Symmetric Key を開いて、User Symmetric Key を得ます。データの復号はクライアント側で実行します。これは概念的な流れであり、個々の項目の暗号鍵や別のログイン方式は省略しています。[01]

Master Password + account salt
    ↓ KDF(PBKDF2 または Argon2id)
Master Key
    ↓ HKDF(用途ごとの鍵素材へ展開)
Stretched Master Key
    + サーバーが保存する Protected Symmetric Key
    ↓ 端末内で開く
User Symmetric Key
    ↓ Vault 項目に関連する鍵と暗号文を復号
Vault の平文(認証済みデバイスで必要な時だけ使用)

区別しておきたいのは、「ログインの認証」と「Vault の復号」です。ログインでは通常、サーバーで検証できる派生ハッシュや MFA も使います。復号には、実際の対称鍵が必要です。マスターパスワードの変更、KDF パラメーターの調整、Vault の暗号鍵のローテーションは別の操作です。パスワードを変えれば、攻撃者が保存済みの古い暗号文が即座に無効になるとは考えないでください。[22]

02 · PBKDF2 と Argon2id:ソルト、反復、メモリーコスト

KDF の入力は、人が覚えやすい一方でエントロピーが不足しがちなマスターパスワードです。ソルト(salt)と高コストの計算によって、攻撃者が推測のたびにコストを払う必要があるようにします。ソルトは通常、秘密にする必要がありません。目的は、同じパスワードでもアカウントごとに異なる出力を得ることと、事前計算した表を使い回しにくくすることです。

PBKDF2-HMAC-SHA256(P, salt, c, dkLen)
P      = マスターパスワード
salt   = 秘密ではないソルト
c      = 反復回数
 dkLen = 出力する鍵の長さ

Argon2id(P, salt, m, t, p)
m = メモリーコスト
 t = 時間/反復コスト
 p = 並列度

Bitwarden の文書に記載された既定値の参考:PBKDF2-HMAC-SHA256:600,000 iterations;Argon2id:32 MiB、6 iterations、parallelism 4。PBKDF2 は主に反復計算を増やし、Argon2id はメモリーも要求することで、大規模な並列推測を安価に行いにくくします。600,000 と 6 を直接比較することはできません。処理のモデルがまったく異なるためです。[02]

単純化したコストモデルでは、総推測時間 ≈ 推測回数 × 一回の推測コスト ÷ 有効な並列数となります。ただし GPU、メモリー帯域、KDF のパラメーター、ハードウェア構成によって結果は大きく変わります。ロック解除にかかった秒数から、信頼できる解析所要時間を直接算出することはできません。長く独立したマスターパスワードが、依然として第一の防御線です。

03 · AES-CBC/HMAC と AES-GCM:違いは数字の大小ではない

「AES-256」は鍵の長さを表すもので、暗号化プロトコル全体の安全性を示すものではありません。データそのものの暗号化に加え、完全性の検証も必要です。そうでなければ、攻撃者による暗号文の改変を確実に検知できない可能性があります。

  • Bitwarden:AES-256-CBC + HMAC-SHA256。CBC が機密性を担い、HMAC が暗号文の完全性を追加で検証します。安全性は、適切な IV、鍵の分離、検証の順序にも依存します。
  • 1Password:AES-256-GCM。GCM は暗号化と認証を統合した AEAD モードです。同様に nonce/IV の適切な管理が必要で、再利用してはならない nonce を再利用してはいけません。

CBC や GCM という名称だけで、製品全体のどちらが安全かは判断できません。エンドポイント、鍵管理、事故からの復旧も同じくらい重要なことが多いからです。[03][05]

04 · TOTP の式:HMAC、時間窓、動的切り詰め

TOTP は HOTP を基にしています。サイトと認証器はランダムな秘密のシード K を共有し、現在時刻をカウンター T に変換してから、HMAC の結果を短い数字へ変換します。[11]

T = floor((UnixTime − T₀) / X)
H = HMAC(K, encode_8_byte_big_endian(T))
OTP = DynamicTruncate(H) mod 10^d

K  = 共有された秘密のシード
T₀ = 基準時刻(通常は Unix epoch)
X  = 時間窓の秒数(通常は 30)
d  = 出力桁数(通常は 6)

RFC 6238 は HMAC-SHA-1/256/512 をサポートします。実際のサービスではシード、桁数、時間窓が一致していなければなりません。6 桁のコードの候補は全部で 10^6 通りしかないため、サーバー側にはログイン失敗のレート制限、時刻のずれへの対応、リプレイの確認が必要です。30 秒以内なら無制限に推測してよいわけではありません。

QR コードには、秘密のシードや、シードを復元できる設定 URI が含まれることがよくあります。通常のログイン用 QR コードだと思ってグループに共有しないでください。K を入手した人は、以後の時間窓のコードを自分で計算できます。

05 · WebAuthn の検証では、どのフィールドを確認するのか?

登録(registration)時には、認証器が特定の RP 向けの公開鍵・秘密鍵のペアを生成し、サイトが Public Key と Credential ID を保存します。ログイン(authentication)時には、サイトが予測できない Challenge を発行し、ブラウザーと認証器が Assertion を生成して、サーバーが検証します。[13]

登録:
  Authenticator → (private key, public key)
  Server        ← public key + credential ID

ログイン:
  Server → challenge
  Authenticator → signature over
    authenticatorData || SHA256(clientDataJSON)
  Server checks:
    challenge / type / Origin
    rpIdHash / UP・UV flags(ポリシーによる)
    signature / credential binding

Origin は WebAuthn API を呼び出すサイトのオリジンを表し、RP ID は資格情報を使用できる依拠当事者の範囲です。偽サイトが自由に本物のサイトの RP ID を名乗ったり、本物のサイト向けの有効なアサーションを取得したりすることはできません。サーバー側も確実に確認する必要があり、署名だけを検証して文脈を無視してはいけません。

「フィッシング耐性」は「すべてのアカウント乗っ取りへの耐性」ではありません。ログイン済みのセッション Cookie、悪意あるブラウザー拡張、弱い復旧フローなどは、別の侵入口になり得ます。[12]

06 · パスキーとは? 同期型とデバイス固定型の違い

パスキーは FIDO 資格情報を利用してログインする方法です。指紋、顔認証、デバイスの PIN を使う時は、通常は端末内で認証器を解除しているのであって、生体情報をサイトへ送っているわけではありません。

  • Device-bound:資格情報が特定の認証器やデバイスに結び付いています。通常はハードウェアによる分離がより明確ですが、予備のキーが必要です。
  • Synced Passkey:提供者が保護する同期の仕組みによって、複数のデバイスで利用できます。復旧は容易になりますが、同期アカウントとデバイスを特に慎重に保護する必要があります。

「秘密鍵は絶対にエクスポートできない」を、すべてのパスキーに当てはめることはできません。ログインできる仕組みと、パスワードマネージャーの Vault を解除する仕組みも、異なる場合があります。例えば、パスキーから Vault の復号用素材を導出するために、WebAuthn PRF のサポートが必要な設計もあります。[01][13]

07 · 1Password の Secret Key、SRP、鍵の脅威モデル

1Password はデバイス上で約 128 bits のエントロピーを持つ Secret Key を生成し、Account Password とともにアカウントの暗号鍵を保護します。これはアカウントの通し番号でも、もう一つ暗記するパスワードでもありません。Secret Key は認証済みデバイスや適切な Emergency Kit に保存します。[04]

SRP(Secure Remote Password) はログイン時の本人認証に使うもので、Vault のデータ暗号化とは別です。設計上の目的は、利用者が入力した元の Account Password を受け取ることなく、サーバー側でパスワードの証明を検証できるようにすることです。[19]

攻撃者がサーバーの暗号化データだけを入手した場合、Secret Key がないことはオフライン攻撃への追加の障壁になります。しかし、認証済みデバイスも支配している、Secret Key を入手した、復旧資料を得た、といった場合には、「サーバー側だけの漏えい」という安全性の推論をそのまま適用できません。

08 · Autofill:URI の照合、iframe、エンドポイントのリスク

Bitwarden の Base domain は実効的な登録可能ドメインを参照し、Host はホスト名を制約し、Exact は URI 全体の完全一致を要求します。機密性の高いサブドメインでは Host/Exact に変更した方がよい場合もありますが、Exact はパスやクエリー文字列の変更で一致しなくなる可能性があります。Android や iOS では、照合できる情報が OS の API に制限される場合もあります。[18]

Bitwarden の「Autofill on page load」は既定で無効です。公式にも、侵害されたサイトがこの利便性を悪用できることが説明されています。手動で入力を開始する、URL を確認する、不審な iframe を避けるといった行動には意味があります。ただし、認証情報を実際に悪意あるページの入力欄へ渡してしまったら、URL の照合だけで、その欄をページ内のスクリプトが読み取ることを防ぐことはできません。[09]

クリップボードの自動消去タイマーは、情報が残る時間を短くするだけです。あらゆるクリップボードの読み取りを防ぐセキュリティサンドボックスと考えてはいけません。

09 · Vault のバックアップと復旧:encrypted JSON、添付ファイル、行き詰まり

デバイス間の同期は主に現在のデータを一致させるもので、アカウントがロックされたり、すべての端末を失ったりした時に過去のデータを取り戻せる保証ではありません。Bitwarden では、Password protected encrypted JSON は別途設定したパスワードで保護され、別のアカウントにもインポートできます。一方、Account restricted は元のアカウントの暗号鍵に依存するため、別アカウントへの災害復旧の唯一の備えには適していません。[16]

通常の暗号化 JSON エクスポートには、添付ファイルが含まれません。添付ファイルを含む ZIP エクスポートも、別途暗号化コンテナーで保護する必要があります。拡張子が ZIP だから暗号化されているとは考えないでください。Vault にログインできない時でも、復旧資料にアクセスできる必要があります。

最も簡単な実地確認は、オフラインで保管した復旧コードが見つかること、バックアップを復号できること、テスト環境にインポートできることを確認し、添付ファイルを別途チェックすることです。必要なら隔離環境で行い、テストのために共有コンピューターへ本物のマスターパスワードを入力しないでください。

↗ /参考資料

公式文書、標準仕様、インシデントの説明です。製品機能や設定名は、実際のバージョンを確認してください。

[01] Bitwarden · Security Whitepaper — Vault の鍵階層

[02] Bitwarden · Encryption Key Derivation — PBKDF2 / Argon2id

[03] Bitwarden · Encryption Protocols — AES-CBC / HMAC

[04] 1Password · About your Secret Key

[05] 1Password · Security model

[06] Twilio · Authy backups & sync

[07] Twilio · Authy Multi-Device

[08] Twilio · Authy Desktop EOL — 2024-03-19

[09] Bitwarden · Autofill from browser extensions

[10] Android Developers · Secure Clipboard Handling

[11] IETF · RFC 6238 / TOTP

[12] NIST · SP 800-63B-4

[13] W3C · Web Authentication Level 3

[14] Google Chrome Help · Use saved passwords in other apps

[15] LastPass · Security incident update — 2022 年のインシデントの続報

[16] Bitwarden · Export Vault Data

[17] Apple Developer · UIPasteControl — iOS のクリップボードアクセス通知

[18] Bitwarden · Form URIs for Autofill — Base domain/Host/Exact

[19] 1Password · Secure Remote Password — SRP によるログイン認証

[20] Bitwarden · Authenticator — ローカル TOTP と Vault 同期の違い

[21] Yubico · Authenticator — ハードウェア TOTP と FIDO2 の違い

[22] Bitwarden · Encryption Key Rotation — マスターパスワードの変更と鍵のローテーション

[関連資料] iThome 鉄人賽 · 暗号学シリーズ

この記事は製品選びと仕組みを整理したもので、図はリスクモデルを簡略化したものです。個別の製品についてセキュリティ監査を完了したことを意味するものではありません。先頭へ戻る ↑

コメントと議論

コメントサービスに接続しています…