password.es があなたのパスワードをどこにも送らない理由

公開日 著者 David Carrero

ウェブページに「パスワードは保存しません」と書く手間は、ほかの何かを書く手間と まったく同じだ。つまりゼロである。あれは文章であって、保証ではない。 本当のことを言う者も、言わない者も、同じ一行を書ける。画面のこちら側から見れば、 二つはまったく見分けがつかない。

パスワードを「診断します」と言って預かるサイトには、根っこにこの問題がある。 たとえそのサービスが非の打ちどころのないものでも——きれいなコード、善意、まっとうな 人たち——あなたにはそれを知る手立てがない。サーバーは閉じた箱だ。手持ちのいちばん 繊細なデータを送りつけて、向こう側で約束どおりのことが起きていると信じるしかない。

そして見落とされがちな点がある。**保存しないという約束は、約束する側にも どうにもできないものからは守ってくれない。**誠実なサーバーにも、誰も見返していない ログがあり、途中の proxy があり、自動バックアップがあり、入ったばかりの社員がいて、 そして単に虫の居所の悪い日がある。パスワードはもうあなたの機械を出ていった。 そのあと何が起きるかは、あなたの手の届かないところにある。多くの場合、彼らの手も 届かない。

何も信じなくていい唯一の答え

解決策は、もっと上手に約束することではない。データを必要としないことだ。

パスワードがブラウザから一歩も出なければ、「彼らはそれをどうするのか」という問いは 成り立たなくなる。「彼ら」がいない。受け取るサーバーもなければ、それが載るログも、 それを含むバックアップも、それを読める社員もいない。信用は上手に管理されるのでは ない。問題から消える。

password.es がやっているのはそれだ。チェッカーは、あなたが 打った文字をあなた自身のブラウザで、あなた自身のプロセッサで解析する。打った文字は どこにも行かない。行く先がそもそも存在しないからだ。

乱数はどこから来るのか

ジェネレーターも考え方は同じだ。ランダムなパスワードを作るには乱数が要る。 手に入れる方法は二つ、サーバーに頼むか、ブラウザに頼むか。サーバーに頼むのは ばかげている。あなたより先にサーバーがそのパスワードを知ることになる。

だからブラウザに頼む。crypto.getRandomValues() を使う。暗号用の乱数のために ウェブプラットフォームが用意した標準 API——まさにこの目的のために存在するもの——で あって、Math.random() とは別物だ。あちらはゲームでカードを切るためのもので、 本気の相手に耐えなければならない用途には向かない。乱数を作るのはあなたの機械の中の ブラウザ自身である。私たちは関与しない。結果はあなたの画面に出て、そこに留まる。

私を信じずに確かめる方法

ここまでの話は、今のところ、このサイトを作った当人が書いた文章にすぎない。つまり、 さっき私が「疑え」と言ったものそのものだ。だから信じなくていい。見てほしい。

ブラウザの開発者ツールを開く——F12、Mac なら Cmd+Option+Iネットワーク (Network) タブに移り、開いたままチェッカーを開く。ページが読み込まれるのが見える はずだ。ここで一覧をクリアし、パスワードの入力欄をクリックして、打ち込んでみる。

これから見えるのは次のものだ。ここは売り込みではなく、正確に書く。

  • **入力欄をクリックした瞬間、リクエストが一本飛ぶ。**それはあなたのパスワードでは ない——まだ何も打っていない——。解析を担うライブラリだ。zxcvbn-ja.min.js という ファイルで、中には照合に使う単語や名前、キーボードの並び、既知のパスワードの一覧が 入っている。欄に触れた時点で password.es から降ってくる。あなたが打っているあいだに 届くようにするためだ。同じドメインから出ていて、静的ファイルで、このページを開いた 誰にとっても同じものである——サイトには言語別のいくつかの版があり、これは日本語版を 読み込む——。
  • **そこから先は、何を打っても一覧は動かない。**一文字でも、二十文字でも、消しても、 やり直しても、長い文章を貼りつけても。リクエストはゼロ。カウンターは動かない。 辞書はすでにあなたのブラウザの中にあり、検索はあなたの機械のメモリに対して行われる。

この区別がすべての差だ。**リクエストがパスワードを運んでいないと信じる話ではない。 リクエストがない、という話だ。**何かを解釈する必要も、コードを読む必要もない。 増えないカウンターを見るだけでいい。

都合の悪いところも含めた棚卸し

議論の骨が「確かめてくれ」である以上、確かめれば見つかるものを隠すのは筋が通らない。 password.es の正直な棚卸しはこうだ。

**アナリティクスはない。**Google Analytics も、控えめな代替も、ピクセルも。かつて 一つあり、全ページから外した。**cookie はない。**サイトは一つも書き込まない。 ブラウザに保存されるものが一つだけある。ライトテーマとダークテーマのどちらが好みか、 それをあなた自身の端末のローカルストレージに置く。どこにも送られないし、同じ 開発者ツールから消せる。登録もアカウントもフォームもない。何かを預けたくても、 預ける場所がない。

そして都合の悪いところ。あるから書く。**ページは読み込み時に、Google のサーバーへ フォントを二つ取りにいく。**つまり、あなたの IP の誰かがこのドメインのページを開いた ことを Google は見ている。ごまんとあるサイトと同じように。打った文字は見えない—— そのリクエストは前に起きて、二度と繰り返されない——。それでも第三者へのリクエスト であり、同じネットワークタブに現れる。開発者ツールを開けと言っておいて、これに 触れないのは筋が通らない。直すべきものの一覧に載っている。

なぜこれを書くのか

「リクエストはゼロ、プライバシーは完璧」と書いて澄ましていることもできた。響きは よかっただろうし、細部で嘘になっていた。辞書のリクエストが一本あり、フォントがある。 確かめられると崩れる主張は、主張ではなかった。宣伝だ。

正確な版は締まりが悪く、そのかわり検証に耐える。あなたが打った文字はブラウザから 出ない。そしてそれは、すでに手元に入っている道具で三十秒あれば見える。

そして、これはそのままあなたの物差しとして返ってくる。**次にどこかのサイトが何かの ために「パスワードを入れてください」と言ってきたら、あのタブを開いて、キーを叩いた 瞬間にリクエストが出るかどうかを見てほしい。**出たなら、あなたのパスワードはもう 出ていった。プライバシーポリシーに何が書いてあろうと、フォームの鍵アイコンが どれだけ立派だろうと、会社がどれだけ堅そうに見えようと関係ない。ぐるぐる回る アイコンのあとで解析済みのパスワードを見せてくるサイトなら、それがどこを通ったかは もうわかっている。

セキュリティでいちばん語られない規則は、パスワードの話ではない。検証の話だ。 信じるのはいい。確かめるほうがいい。ここではタダだ。


出典:password.es 自体のアーキテクチャ。どのブラウザの開発者ツールでも検証できる ——チェッカーは入力欄にフォーカスした時点で、解析ライブラリとその一覧 (zxcvbn-ja.min.js) を自身のドメインから読み込み、入力中は一切のリクエストを 発しない · crypto.getRandomValues()、暗号用の乱数のための Web Crypto API の標準 API · サイトのコードにアナリティクス、ピクセル、cookie は含まれない。ローカルに保存される 唯一のデータはテーマの設定である · フォントは Google Fonts から配信される。

← ブログに戻る