PA PassAfer

なぜ暗号化はブラウザで行うべきなのか

パスワード生成、監査、ファイル暗号化をサーバーに任せると、平文は通信経路・ログ・メモリに余分な層を残します。クライアントサイドの Web Crypto は、その計算を端末へ戻します。Network パネルを開けば、今回の操作が秘密を外へ出したかどうかを自分で確認できます。

いわゆる「オンラインパスワード生成」を開き、生成を押し、開発者ツールの Network パネルを見てください。リクエストボディやクエリに、今つくった文字列が出ていれば、平文はすでに端末を離れています。ブランドの約束を信じる必要はありません。ブラウザ自身が通信を見せます。

暗号化をブラウザ内で行うのは、「分散っぽく聞こえる」ためではありません。平文の露出窓を端末側へ圧縮するためです。通信が一段減り、サーバーログが一份減り、運用担当がメモリダンプを誤読する機会も減ります。以下では脅威モデル、自分でできる確認手順、そしてその限界を整理します。PassAfer のツール群はこの原則で設計されています。本稿は製品の総覧ではなく、「なぜ機密計算を既定でサーバーに渡すべきでないか」だけに答えます。

サーバー代行が広げる露出窓

平文の露出窓とは、平文(またはそれを直接復元できる鍵)が実際に存在する箇所です。サーバーが計算すると、窓は「送信ボタンを押した瞬間」では済みません。事後に消すのが難しい連鎖になります。

  • ブラウザからオリジンまでの TLS セッション。サーバープロセスが見るのは復号後のリクエストであり、暗号文ではありません。
  • リバースプロキシ、WAF、APM、エラートラッキングによるリクエストボディのサンプリング。HTTP 500 一回でフォームがクラッシュレポートに入ります。
  • アプリログ、スロークエリ、アクセスログのクエリ文字列。?key= に鍵を置く習慣は、access log へ書くのと同じです。
  • データベース、オブジェクトストレージ、一時ディスク、バックアップと遠隔コピー。
  • 運用・サポート・侵入者が上記いずれかを手にする時間。「使い終わったら消す」約束では、すでに開いた窓は閉じられません。

法域と下請けは「見ません」を監査しにくい文に変えます。あなたが照合できるのはプロトコルとトラフィックであり、相手のデータセンター内の社内規程ではありません。

パスワード生成では特に痛いです。欲しいのは、どのシステムにもまだ現れていない秘密です。生成が他人のラックで起きると、最初のコピーはすでに手元にありません。あとで本番設定、CI 変数、パスワードマネージャへ貼っても、漏洩源には見えないノードが一つ増えています。

パスワード監査も同じです。使い回しているパスワードを遠隔の「強度チェック」へ送るのは、最も機微な認証情報を第三者に渡すことです。公開漏洩リストの照会は k-anonymity のようなプロトコルにもできます。PassAfer の Password Audit はより硬い制約を取ります。検証中のパスワードはアップロードせず、強度推定と漏洩トップリスト照合はブラウザ内で完結します。確認すべきは「保存していないと主張している」ことではなく、リクエストにその文字列がそもそも無いことです。

ファイル暗号化で「アップロード → サーバー暗号化 → 再ダウンロード」すると、パスフレーズとファイル内容は少なくともサーバーメモリ上に揃います。ローカルのストリーミング暗号化なら、サーバーが受け取れる平文はありません。写真なのかディスクイメージなのかを知る必要すらありません。

「HTTPS だからローカル計算」ではない

TLS が守るのは経路上の盗聴者であり、対向サーバーではありません。サーバー代行では、対向は平文を読む前提です。ローカル計算が解くのは、「対向はこの材料を見るべきでない」という別の問いです。

「ローカル」はどの層を指すか

「ローカル」はスローガンになりやすいです。分解しないと、ネットディスクの「自分だけ閲覧可」までクライアントサイド暗号化と呼ばれます。

クラウドアカウントではなく、手元のプロセス

PassAfer の言うローカルは、計算がブラウザのタブで起きることです。乱数は crypto.getRandomValues、対称暗号は Web Crypto API です。この API は 保護されたコンテキスト(HTTPS または localhost)でのみ使え、ブラウザがネイティブ実装します。鍵材料は寿命の短い CryptoKey にあり、分析フィールドとして外へ出ません。結果はコピー、エクスポート、ディスクへの保存ができます。タブを閉じれば、メモリ上の平文はブラウザの寿命に従い、遠隔に二通目は残りません。

「自分だけ見えるフォルダへファイルを置く」とは別物です。オブジェクトストレージは、手元で封をしてから暗号文を上げない限り、平文を読めることが多いです。ローカル優先が問うのは、利用可能な形の平文が端末の外に一度でも存在したか、です。

アルゴリズムとファイル上限は照合できる事実

初版の対称暗号は AES-256-GCM のみです(認証付き暗号。改ざんされた密文は復号に失敗します)。ファイル暗号化は単一ファイルをストリーム処理し、上限 5 GB、出力は .lock(推奨)または .enc です。長い動画を一度にメモリへ載せる必要がありません。数字は要件に書いてあり、形容詞ではありません。未実装のアルゴリズム切替が画面にあっても、製品説明を正とします。

ローカルは「全機能が公開」ではない

計算位置とログイン権限は別です。未ログインでもランダム文字とパスフレーズの生成、コピー、エクスポートは使えます。Password Audit、プライバシーツール、Burn-Link の作成、ファイル暗号化、パスワード庫はログイン後に解禁されます。「ローカル」を「誰でも全ツールを使える」と読むと、権限マトリクスと衝突します。

機能 未ログイン 機微データは既定でアップロードされるか
ランダム / パスフレーズ生成 利用可 アップロードしない。ブラウザ内で生成
パスワード庫へ追加 ログイン案内
Password Audit ログイン案内 検証パスワードはアップロードしない。強度と漏洩リストはローカル
Clean Link / マスキング ログイン案内 URL とテキストはローカル処理。analytics に書かない
Burn-Link 作成 ログイン案内 上がるのは暗号文 blob であり、原文ではない
Burn-Link 閲覧 受信者に公開 鍵は URL の # フラグメント。HTTP ではサーバーへ送られない
ファイル暗号化 ログイン案内 ファイルとパスフレーズはアップロードしない。端末内のストリーム AES-256-GCM

Burn-Link だけサーバーに一時保管が必要ですが、保管するのは暗号文です。復号鍵は URL の # 以降に置きます。フラグメントは HTTP リクエストに含まれません。access log に残るのは通常パスだけです。閲覧ページは受信者に公開します。相手に先に登録させると、一度きりの秘密共有が成立しません。初回閲覧後、暗号文は設計どおり焼却されます。サーバーのゼロ知識は「何も保存しない」ではなく、「保存しても開けない」です。本稿ではこの契約だけ置きます。

Network パネルで機密が外に出たか確認する

スローガンは自己証明しません。次の手順は信頼関係を必要とせず、ブラウザ付属の開発者ツールだけで足ります。目的は「世界にサイドチャネルが無い」ことの証明ではなく、「クリック一回で平文を POST する」オンラインツールを暴くことです。

01

ログイン不要のパスワード生成から始める。パスワード生成ページを開き、ログアウトのままにします。ランダム文字もパスフレーズもそのまま生成できるはずです。アカウント通信と「生成が外へ出たか」を切り分け、ログインリクエストを誤って漏洩と見なさないためです。

02

Network を開き、Preserve log を入れる。Chrome / Edge / Firefox いずれも可能です。まず Fetch/XHR、次に全リクエストを見ます。Preserve log は遷移で記録が消えるのを防ぎます。sendBeacon と Service Worker 経由の通信もパネルに出ます。

03

見分けやすいパスワードを生成する。長さを少し伸ばし、メモへコピーします。Network の検索欄にその全文、または JS ソースに偶然出なさそうな部分文字列を貼ります。

04

URL、Query、Request Payload にヒットがあるか見る。どのリクエストにもその部分文字列が無ければ、少なくとも「生成」のクリックでは平文が HTTP 内容として外へ出ていません。静的スクリプト内の無関係な文字列は対象外です。探すのは今つくったその一通です。

05

ログイン後のツールも同じ方法。Password Audit、プライバシーツール、ファイル暗号化はログインが必要です。テスト専用の仮パスワードや小さなファイルで再検索します。監査は検証パスワードを遠隔へ送らず、洗浄は原文を POST せず、ファイル暗号化は平文を multipart で上げないはずです。

06

Burn-Link は暗号文とフラグメントを見る。作成(要ログイン)でサーバーへ行くのは暗号文であり、入力した原文ではありません。完全なリンクでは鍵は # の後です。フラグメントを外して Network を見ると、リクエストパスに鍵は出ないはずです。受信者は閲覧ページをログインなしで開けます。

この手順が証明できること、できないこと

Network が示すのは、今回の操作が平文を HTTP に載せたかです。同一オリジンのスクリプトがメモリを読むこと、悪意ある拡張、すでに XSS で改変されたページは見えません。多数の「オンラインツール」を暴くには十分です。形式的証明と混同しないでください。

必ずローカルに残すものと、例外の言い方

一度外へ出したら撤回できない材料は端末に残します。新規生成のパスワード、検証中の旧パスワード、マスキング前の原文、ファイル平文、対称鍵です。他人のログに入れば、タブを消しても相手のコピーは消えません。

端末を離れられるのは、暗号学的にサーバーにとって無意味なもの、またはアカウント体系そのもののデータです。Burn-Link の暗号文 blob、ログイン用のユーザー名とログインパスワード、秘密を含まない静的リソースです。「ログイン」と「ツールの平文アップロード」を混ぜないでください。ログインは権限の段階です。未ログインでもパスワード生成はでき、監査・洗浄・焚鎖作成・ファイル暗号化・パスワード庫はログイン後に開きます。ログイン資格情報はアカウント経路を通り、「今つくった新しいパスワードが上がったか」とは別の問いです。

ファイル暗号化の出力は、ディスクへダウンロードする .lock / .enc です。その後、ネットディスク、USB、メールで運ぶのは暗号文ファイルです。暗号文をネットディスクへ置いても、パスフレーズと原文はそのストレージから見えません。ただしパスフレーズを同じ送信や同じメールの平文に書いていないことが前提です。ローカル暗号化が変えるのは「ストレージ管理者が既定で写真を開ける」ことであり、物理的な保管責任ではありません。

プライバシーツール(Clean Link と Data Redaction)も URL とテキストをブラウザ内で処理します。UTM や広告パラメータを剥がし、電話番号や身分証らしい文字列をマスクし、外へ出す前に結果を照合できます。原文はアップロードせず、analytics イベントの内容にもしません。洗浄がチケット全文をサーバーへ POST して「マスキング済み」を返すなら、平文の窓はすでにサーバー側で開いており、マスキングは表示層に過ぎません。

ブラウザ内暗号化の境界と誤解

ローカル優先が減らすのは、サーバーと経路上の露出です。マルウェアに支配された PC は救いません。境界を期待値に書く方が、フッターに AES の三文字を置くより役に立ちます。

ページが注入されたら、アルゴリズムは助けない

XSS や乗っ取られたスクリプトは入力欄を読めます。Web Crypto が守るのは「誠実なページ上の鍵操作」であり、「敵対スクリプトがすでに同一オリジンにいる」状態ではありません。依存するのは同一オリジンポリシー、コンテンツセキュリティポリシー、フロントエンドのサプライチェーンです。「AES-256-GCM」を見て「だから XSS は無効」と推論しないでください。

拡張機能、社内プロキシ、肩越し

ブラウザ拡張と、SSL を復号する社内プロキシは、依然としてページ内容を見られます。会社プロキシがルート証明書を入れると、Network パネルが見せるのはプロキシの向こう側です。端末紛失、画面共有、肩越しはローカル計算では防げません。エンドポイントの問題と、「サーバーが平文を持つべきでない」は分けて扱います。

「アップロードしない」は「ネットに繋がない」ではない

ページ本体、スクリプト、ログインリクエストは出ます。確認するのは機微フィールドがリクエストに出たかであり、LAN ケーブルを抜くことではありません。PassAfer は検証パスワード、洗浄原文、ファイル内容を分析イベントとしても送りません。イベントに秘密そのものを載せません。

能力を書き過ぎない

初版アルゴリズムは AES-256-GCM です。画面に切替可能な RSA や、未提供の国産暗号オプションを期待しないでください。Burn-Link の閲覧ページをログイン必須と書かないでください。サーバーが平文や鍵を見られると主張しないでください。それは製品事実と逆です。ローカル優先の正直な書き方は、機密計算はブラウザで完了し、平文・鍵・ファイルは既定でアップロードせず、焚鎖のサーバーは暗号文だけを一時保管する、です。

自分で確かめるなら、どこから始めるか

「生成の一回が外へ出たか」だけ先に知りたいなら、パスワード生成が最も向いています。ログイン不要で、ランダム文字もパスフレーズも端末内で完了し、コピーとエクスポートも同様です。Network を開き、上の手順で今つくった文字列を検索してください。コストが最も低く、「平文の露出窓」の直感も得やすいです。

よくある代替手段の限界は具体的です。平文メールやチャットは、双方の履歴、サーバー保管、端末バックアップに鍵を残します。ネットディスクは、手元で先に暗号化しない限りサーバー側が読めます。鍵をクエリパラメータに置くと、ほぼ確実に access log へ入ります。不便さの問題ではなく、平文の窓が設計に組み込まれています。

ネットディスクへそのまま置けないファイルをバックアップするなら、ログインしてファイル暗号化を使います。ブラウザ内で AES-256-GCM のストリーム暗号化、単一ファイル 5 GB まで、.lock または .enc をダウンロードします。その過程をキャプチャし、元ファイルが POST されていないことを確認できます。短い機密を同僚へ一度だけ渡し、鍵をサーバーログに残したくないときは Burn-Link です。ローカルで暗号化し、鍵は # 以降、サーバーは暗号文だけ、閲覧ページは相手の登録不要です。本稿が求める答えは一つです。このクリックのあと、平文はまだ自分のタブの中にあるか。

PassAfer のスローガンは「ローカル暗号化、どこでも安全」です。どこでも、の前提は、計算が今見ているこのタブで起きており、ブラウザ付属のパネルでそれを一度照合できることです。