正しい生成器、
正しい言語。
すべてのパスワード生成器が同じではありません。そして、あなたのボルトがどの言語で書かれているかは、単なるエンジニアリング上の細部ではありません。エントロピー、生成モード、そして Rust が内部で重要になる理由を読み解きます。
パスワードマネージャーが「強いパスワードを生成する」と言うとき、問うべきことは2つあります。本当に予測不能なのか、つまりランダム性の品質。そして、表示された後にメモリ上でどう扱われるのか。前者は生成モードの問題です。後者はアプリケーションを動かす言語の問題です。この記事ではその両方を扱います。
01 / 基本エントロピー: 本当に重要な唯一の尺度
パスワードの強さは、感覚的な「複雑さ」ではなく、エントロピーで測ります。攻撃者にとっての不確実性を bits で表したものです。可能な組み合わせが多いほど、brute-force 攻撃のコストは爆発的に増えます。ASCII 全体から選んだ16文字のパスワードは約 100 bits に達し、「非常に強い」領域に入ります。
よく見落とされる重要点があります。エントロピーは、ランダム性の源がCSPRNG、つまり暗号学的に安全な疑似乱数生成器である場合にだけ意味を持ちます。通常の Math.random() は予測可能で、それ以外のすべてを台無しにします。良い実装は OS からエントロピーを読みます。Unix では /dev/urandom または getrandom(2)、Windows では CNG です。
02 / モード生成器の4つの系統
優れたマネージャーは「1つの」生成器ではなく、用途に合わせた複数のモードを提供します。原則は、覚えやすさは長さで支払うということです。最も密度の高いものから、人間に扱いやすいものまで、4つの系統を見ていきます。
純粋なランダム
j7$kQ!mP2#xR9vL@Passphrase(Diceware / EFF)
Granite-Bicycle-Phantom-Violet-9覚えやすい / 発音しやすい
Crimson7!Falcon$Reef数字 PIN
8392 4471正しい考え方: 用途にエントロピーを合わせる
ログインページでレート制限されている Web アカウントでは、攻撃者は毎秒数百回程度の試行に縛られます。そのため 50 bits でも地質学的な時間に耐えます。過剰なエントロピーが意味を持つのは、暗号化キーや crypto ウォレットの seed のようなオフラインの secret です。そこでは攻撃を大規模に並列化できます。 こうした非常に価値の高い secrets では、物理的なサイコロを実際に振る、つまり本来の意味での Diceware が究極の選択肢であり続けます。CSPRNG の品質や、侵害されたブラウザへの依存を完全に取り除けるからです。
03 / 内部ではRust が流れを変える理由
良いパスワードを生成することは、仕事の半分です。もう半分は、それを残したままにしないことです。表示または復号されたパスワードは RAM 上に存在します。そしてここで、アプリケーションの言語が決定的になります。
Microsoft は、自社が遭遇するセキュリティ脆弱性の 70 % がメモリバグ、たとえば buffer overflow や use-after-free などであると報告しています。Google も Chrome と Android で同じ比率を観測しました。Rust は ownership と borrowing のモデルにより、garbage collector なしで、まさにこれらの欠陥クラスをコンパイル時に排除します。
Google の数字は明快です。Android のメモリ脆弱性は、2019年の 223 件から 2024年には 50 件未満に減少し、初めて全体の 20 % を下回りました。新しい Rust code は、従来の C/C++ code と比べてメモリ欠陥の密度が最大で1000× 低いことを示し、さらに rollbacks は 4× 少なく、レビュー時間も 25 % 短縮されています。
1. Garbage collector なしのメモリ安全性。 Java や Python のような言語は memory-safe ですが、garbage collector は非決定的にメモリを解放します。つまり secret がいつまでも残り、memory dump や cold-boot 攻撃にさらされる可能性があります。Rust はデータが使われなくなった時点で、決定的にメモリを解放します。
2. zeroize による明示的な消去。 Rust は、解放されたメモリが上書きされることまでは保証しません。zeroize crate はこの穴を埋めます。secret を Zeroizing で包むことで、スコープを抜けた正確なタイミングでゼロに上書きされることを保証します。これは compiler が最適化で消せない volatile write によって行われます。
3. Crypto の正しい使い方を強制する型システム。 Rust の厳格な型システムは、機密データをどのように、何回使えるかを制限できます。たとえば、一度だけ使える key をモデル化し、compiler が再利用を拒否するようにできます。
メモリ上での自動消去use zeroize::Zeroizing;
fn unlock_vault(master: &str) {
let dek = Zeroizing::new(derive_key(master));
// ... déchiffrement du coffre ...
} // `dek` est écrasé par des zéros ici, automatiquementメモリ脆弱性 — ANDROID(全体に占める %)
RUST 採用
技術的な正直さ: Rust は魔法の杖ではない
unsafe code と third-party dependencies は依然として攻撃面です。実際 Google は、本番投入前に Rust parser の unsafe block にあった脆弱性(CVE-2025-48530)を修正しています。メモリ安全性は層であり、目的そのものではありません。Argon2id のような強力な KDF、zero-knowledge architecture、auto-locking、MFA といった defense in depth と組み合わせて初めて機能します。
Garbage-collected な言語
- 非決定的なメモリ解放
- Secrets が不明な時間だけメモリに残る
- 明示的な消去が難しい、または不可能
- Dumps と cold-boot にさらされる
Rust
- 決定的な解放(ownership)
- zeroize による即時消去
- buffer overflow も use-after-free もない
- Crypto errors をコンパイル時に捕捉
04 / 要点パスワードマネージャーに求めるべきこと
パスワードマネージャーを選ぶ、または評価するときは、次の4つの具体的な質問をしてください。
Checklist
- 1. 生成器は system CSPRNG に基づいており、エントロピーを bits で表示するか?
- 2. マスターパスワード向けに Diceware/EFF passphrase mode を提供しているか?
- 3. 生成はサーバーを経由しない local(client-side) か?
- 4. 機密性の高い core は memory-safe language で書かれ、secrets を明示的に消去するか?