ブラウザローカル暗号化で、平文が端末を出ていないことを確認する

「ブラウザローカル暗号化」を信じてよいかは、スローガンではなく、この操作がどのリクエストを出したかで決まります。この実験にしか出ないカナリア文字列で Network を検索してください。リクエスト行、本文、アクセス解析に平文、パスフレーズ、# の後ろの鍵は出てはいけません。AES-256-GCM はこの端末の Web Crypto で完了してから、暗号文だけが出てよいはずです。

先に結論です。ローカル暗号化でその場で確認できるのは、「この HTTP が平文、パスフレーズ、フラグメント鍵を業務データとして出したか」です。拡張機能がクリップボードを読んでいない証明にも、次の版の挙動が同じである証明にもなりません。以下は繰り返せる手順であり、新しい形容詞ではありません。

検索意図に一文で答える

ブラウザローカル暗号化とは、暗号化と復号が今見ているタブで起きることです。スクリプトはブラウザの Web Crypto API を呼び、AES-GCM 系のアルゴリズムをこの端末で完了させます。平文と鍵は、デフォルトでは HTTP 本文としてブラウザを出ません。確認方法は宣伝文を読むことではなく、開発者ツールの Network を開き、カナリアで検索し、必要ならオフラインで再測することです。

この記事は開発者、運用、そしてファイルやパスフレーズを「オンラインツール」に渡す前に自分の目で見たい人向けです。ファイル暗号化ボックスの操作説明の代わりにはならず、ホームの製品定義も繰り返しません。持ち帰るべきなのは、どのサイトでも使える確認手順です。

スローガンは自らを証明できない。通信は観察できる

多くのページに、ローカル計算、ゼロアップロード、エンドツーエンドと書いてあります。この言葉は、本当にこの端末で計算し終えるツールにも、「先に原文を POST し、サーバーが代わりに暗号化する」アップロードページにも置けます。文そのものにチェックサムはありません。

その場で見えるのは、今開いているタブが出したメソッド、アドレス、クエリ、リクエスト本文です。Chrome の Network パネルが一覧にします。いま選んだファイル名、いま入力したパスフレーズ、自分だけが知る実験原文がそこに出たら、いわゆるローカル暗号化は、この操作では成立していません。

逆も狭いです。パネルに平文がないことは、観察したリクエストがこれらの欄を運んでいない、という意味だけです。メモリに平文がなかった証明にも、ブラウザ拡張が入力欄を読んでいない証明にもなりません。宣伝を一度の再現可能な観察に落とす価値は、もう十分あります。同僚に「カナリアを検索した。リクエスト行と body はきれいだった」と言えればよく、公式サイトの一文を転送する必要はありません。

本物の鍵、証明書番号、マスキングしていない表で実験しないでください。捨ててよい小さなファイルを用意し、パスフレーズは一度きりの長い文にしてください。確認するのは通信であり、プライバシーをもう一度晒すことではありません。

「ローカル」が指す計算の層

「ブラウザローカル」は「このドメインが安全そう」という意味ではありません。「暗号演算が、今の文書のスクリプト環境で起きている」という意味です。AES-256-GCM なら、よくある正しい経路は crypto.subtle.encrypt です。鍵導出、暗号化、認証タグは、いずれもブラウザ同梱の API を通ります。MDN は、SubtleCrypto.encrypt がセキュアコンテキストでのみ使えると書いています。本番では HTTPS です。普通の HTTP ページでは crypto.subtle はしばしば undefined です。

AES-GCM を選ぶ理由は、名前が格好いいからではありません。完全性を伴う認証付き暗号です。暗号文が改ざんされるか、鍵を間違えると、復号は失敗します。「乱数に見える誤った平文」は出ません。IV はよく 12 バイト(96 ビット)で、NIST SP 800-38D の GCM 推奨と揃えています。暗号化のたびに新しい乱数 IV を使い、同じ平文でも異なる暗号文になるようにします。

ファイルの流れは、もっと具体的な動作に書けます。ファイル選択でこの端末のファイルを選び、スクリプトが塊ごとにメモリへ読み、塊ごとに暗号化し、ブラウザに暗号文のダウンロードを促します。手元に落ちる .lock.enc は、この端末が作った結果ファイルであり、サーバーの受領証ではありません。単ファイル上限が 5 GB と書いてあっても、それはブラウザ内のストリーム処理の能力であり、リモート側が 5 GB の原文を受け取った意味ではありません。

「業務アップロード」と「ページがもともと出すリクエスト」も分けてください。開いてすぐ使えるツールサイトでも、スタイル、スクリプト、フォントは読み込みます。本文のないアクセス解析も送ることがあります。これらの存在を「ファイルがアップロードされた」証拠にしてはいけません。ただし解析の query や body に、いま入力したパスフレーズ、診断したパスワード、洗浄前の原文が出たら、話は別です。

FastPwd はこの境界を、確認できる文にしています。パスワード生成、パスワード診断、プライバシー洗浄、ファイルの暗号化/復号の平文と鍵は、デフォルトでブラウザを出ません。Burn-Link が出してよいのは暗号文だけです。復号鍵は URL の # フラグメントに置きます。ファイル暗号化ボックスは 1 MB ずつ分割し、PBKDF2(100000 回、SHA-256)でパスフレーズから AES-256 鍵を導き、.lock / .enc を出力します。どのツールも開いてすぐ使え、アカウントも保管庫もありません。約束は、あくまで約束です。以下では Network で点検項目に落とします。

Network でカナリア検査をする

まず、本物の業務に出ない印を用意します。ファイル名は canary-fp-20260825.bin、パスフレーズはランダムな長い文、本文にはこの実験にしかない一文を書いてください。カナリアの役割は検索です。Network のフィルタに貼り付け、ヒットしたら失敗です。

開発者ツールを開き、Network に切り替え、Preserve log をオンにします。フィルタはまず All にしてください。最初から XHR だけにしないでください。キャンセルされたリクエストや 4xx も、すでに平文を運んでいることがあります。それから一通り操作します。ファイルを選び、パスフレーズを入れ、暗号化または生成をクリックします。終わっても、先にパネルを閉じないでください。

  1. フィルタにカナリア文字列を貼り付けます。赤いヒットが出たら止まって、そのリクエストを読んでください。「ローカルっぽい」判断に戻る必要はありません。
  2. ヒットがなければ、Fetch / XHR を一つずつ開き、リクエスト行、クエリ、本文を照合します。スタイル、フォント、スクリプトは無視してかまいません。
  3. アクセス解析のパスを別に絞り、query と body を開きます。ページタイトルとパスは出てかまいません。いま入力したパスフレーズ、診断したパスワード、洗浄前の原文、ファイル内容は出てはいけません。

リクエスト行を見る

完全な URL の path と、疑問符の後ろのクエリは、一字ずつ見る価値があります。id のような位置特定の欄は出てかまいません。ファイル名、パスフレーズ、診断したパスワード、# の後ろの鍵は出てはいけません。アドレスバー全体とリクエスト行を比べてください。# 以降がリクエスト行に入っていたら、実装がフラグメントを query と取り違えたか、スクリプトが読み出してリクエストに書いたかです。

リクエスト本文を見る

POST / PUT の payload が二箇所目です。ファイル暗号化がローカル完了をうたうなら、本文に元ファイルのバイナリもパスフレーズもあってはなりません。Burn-Link に暗号文の欄があるのは、想定どおりの出域データです。いま入力した原文に見えないことを確認してください。パスワード診断ページが対象パスワードを POST したら、目的が「漏洩照会」でも「強度計算」でも、すでにこの端末を出ています。

アクセス解析を別に見る

アクセス解析は見落とされがちです。主 API がきれいで、報告に入力欄の全文が入っていれば、この操作はまだ「平文がブラウザに残った」とは言えません。解析パスを絞るとき、「解析スクリプトは無害」と決めつけないでください。別種の出域リクエストであり、点検の仕方は業務 API と同じです。FastPwd のアクセス解析はサイト自身の tracker を使い、localhost ではデフォルトで送りません。それでもカナリアで、報告にパスフレーズやファイル内容がないことを確認してください。

Preserve log をオンにしてください。暗号化のあとページが遷移または更新され、チェックがオフだと、平文を運んだ最初のリクエストが消えていることがあります。偽の「パネルは空」になります。

オフライン再測:静的資源は業務アップロードではない

二番目の対照は安上がりです。ページを最後まで読み込ませ、Network で Offline にするか、システムのネットワークを切ってから、捨ててよい小さなファイルを暗号化します。.lock のダウンロードが完了すれば、この回の暗号化/復号はリアルタイム API に依存していません。これは「ブラウザローカル暗号化」の強い信号ですが、唯一の信号ではありません。

偽の失敗もよくあります。Offline でフォントや解析スクリプトが赤くなるのは、暗号化の失敗ではありません。見るべきなのは、暗号化ボタンのあとに新しい業務 POST があるか、結果ファイルがダウンロードフォルダに出たかです。偽の通過もあります。スクリプトは平文をキューに入れ、再接続後に送ることができます。オフラインを通したあと、オンラインでもカナリア検索をしてください。

疑問符は HTTP に入る。# はデフォルトでは入らない

URL には、よく混同される二段があります。疑問符の後ろのクエリは HTTP リクエスト行に入り、サーバー、リバースプロキシ、アクセスログから見えます。# の後ろのフラグメントは、デフォルトではブラウザが手元に残し、今のページのスクリプトが読みます。HTTP のリクエスト対象に fragment は含まれません。これは RFC 9110 のリクエスト対象の約束であり、URL.hash がブラウザ側にしかない理由でもあります。

そのため、一度きりの暗号文リンクが鍵を # に置くと、受信側が s.html?id={id}#{key} を開いても、サーバーは設計どおり id だけを見ます。鍵は見えません。追加の暗号プロトコルではなく、ブラウザのフラグメントの既定動作です。境界もあります。完全なアドレスをチケット、グループチャット、hash を落とすプレビューカードに貼ると、鍵は「HTTP に入らない」から「他人の画面とログに出る」へ移ります。

確認方法も具体的です。Burn-Link で無害なテスト文を作り、作成リクエストの body が暗号文だけかを見ます。閲覧ページを開いたとき、文書リクエストと後続 API の URL に id だけがあるかを見ます。アドレスバーの # 以降は、これらのリクエストに出てはいけません。閲覧ページは受信側に公開され、ログインは不要です。

見る場所 HTTP に入るか 合格の条件
ページのスローガン 対象外 証拠にしない。対照だけに使う
リクエスト行 / query 入る カナリアなし、パスフレーズなし、フラグメント鍵なし
POST body 入る 原文なし。Burn-Link は暗号文のみ可
URL の # フラグメント デフォルトでは入らない アドレスバーにはあり、リクエスト行にはない
アクセス解析 実装次第 入力欄の原文なし
Offline 後の暗号化 新しい業務リクエストなし 暗号文はダウンロードできる。再接続後にカナリアを検索

証明できること、できないこと

この点検が支えられる結論は狭いです。はっきり書いた方が役に立ちます。

支えられること:使っているこのブラウザ、この版、この操作では、平文、パスフレーズ、フラグメント鍵は、観察できた HTTP の業務データや解析原文としてタブを出ていない。

支えられないこと:別タブや拡張がクリップボードを読んでいない。ディスクのダウンロードフォルダが安全である。相手が暗号文を受け取ったあと画面を撮らない。パスワード診断が全ウェブの漏洩庫を覆っている。診断がローカルのエントロピーと公開の弱いパスワード Top 一覧だけなら、答えられるのは「よくある弱いパスワードに似ているか」であり、「ある漏洩に一度も出ていない」ではありません。全ウェブの HIBP 照会ではありません。

これを侵入テストとも取らないでください。WebSocket も Service Worker キャッシュも見ておらず、難読化スクリプトも逆解析していません。目標は、同僚にこう説明できることです。Network を開き、カナリアで検索し、リクエスト行と body はきれいだった。これは「公式がアップロードしないと言っている」を転送するより、エンジニアの議論に近いです。

よくある質問

オフラインでも暗号化できれば、アップロードしていない証明になりますか?

証明できるのは、この回の暗号化/復号がリアルタイム API に依存していないことだけです。ページにキャッシュ済みのスクリプトは、再接続後にリクエストを送る可能性があります。オフラインを通し、オンラインでも同じカナリアで Network を再検索してください。両方通って、結論は立ちます。

Network パネルが空なら、この操作は安全ですか?

なりません。フィルタが Img だけ、Preserve log がオフ、遷移でリクエストが消える、いずれも偽の空白を作ります。フィルタを All に戻し、カナリアを検索し、アクセス解析も別に開いてください。空のパネルは観察の失敗であり、安全の証明ではありません。

Burn-Link が暗号文をサーバーに置くなら、まだブラウザローカル暗号化ですか?

「平文はこの端末で計算し終えてから出る」と考えます。サーバーが見るべきなのは暗号文と、探すための id だけです。復号鍵はリンクの # の後ろにあり、デフォルトでは HTTP に入りません。作成も閲覧もアカウントは不要です。確認すべきなのは、body が原文かどうかと、リクエスト行に # 以降の鍵があるかどうかです。

パスワード診断は対象パスワードを全ウェブの漏洩庫へ送りますか?

FastPwd の パスワード診断 は、この端末で強度を計算し、内蔵の公開弱いパスワード一覧と照合します。対象パスワードはアップロードしません。よくある弱いパスワードは見つけられますが、「全ウェブで見たことがない」証明にはならず、Have I Been Pwned 式の照会でもありません。対象パスワードをカナリアにして Network を検索すれば、この一条を確認できます。

同じ手順を、開いてすぐ使えるツールに使う

計算の境界がはっきり書いたページで練習するなら、FastPwd のファイル暗号化ボックスから始めてください。開いてすぐ使え、登録は不要です。本物のプライバシーを含まない小さなファイルを選び、パスフレーズはカナリアにし、暗号化して .lock をダウンロードします。同時に Network を見てください。静的資源と、あるかもしれないアクセス解析は見えてよいはずです。元ファイルやパスフレーズが業務欄として見えてはいけません。アルゴリズムは AES-256-GCM、Web Crypto で計算し、単ファイルは 5 GB までです。

Burn-Link は二番目の練習に向きます。無害なテスト文を作り、出るのが暗号文であることを確認します。閲覧ページは受信側に公開され、リンクの形は s.html?id={id}#{key} です。プライバシー洗浄 は「原文が解析に入るか」の練習に向きます。リンクとマスキング前のテキストは、製品説明どおりブラウザに残り、洗浄結果が十分かどうかは、あなたが判断します。

これらの練習の目的は、あるサイトが「絶対に安全」だと証明することではありません。同じ確認手順に慣れることです。ローカル暗号化をうたうどのページでも、手順は同じです。カナリア、Preserve log、リクエスト行、本文、解析報告、必要なら Offline をもう一度。

次に確認するときは、三つ覚えてください。第一に、通信を見る。スローガンは見ない。第二に、暗号文が出るのは受け入れてよい。鍵と原文はだめです。第三に、ブラウザ、版、機能を変えたら、カナリア検索をもう一度。繰り返せる観察だけが、自分たちのセキュリティ説明に書く価値があります。