1なぜつくったか
AIで資料を作る人が増えた。「これHTMLで出力して」と頼めば、レイアウト付きの資料、フロー図、インタラクティブな要素 — PDFやパワポにはない表現力を持つドキュメントが短時間で出来上がる。
でも、そうやって作ったリッチなHTML資料を「社外に送る」となった瞬間、困ることがある。
HTMLには、パスワード保護がない。
テキストエディタで開けば全文読める。メールで送った瞬間、中身は丸見え。PDFにもパワポにもZIPにもパスワード機能はあるのに、HTMLだけ — ない。
それなら作ろうと思った。
2つくったもの ― Secure HTML Container とは?
ZIPよりスマート、PDFより自由。かもしれない。
Secure HTML Container — どんなファイルもパスワード付きHTMLに変換するフォーマットだ。ファイルをドロップして、パスワードを決める。それだけで暗号化HTMLができあがる。サーバー不要。ブラウザだけで完結する。
ブラウザだけで「ファイルをパスワード付きHTMLに変換できる」ツールを公開しました☺
— 謎みくす (@nanomix_ltd) February 27, 2026
処理はすべてブラウザ内で完結。
データは外部に送信されません。
(記事は近々🫡)https://t.co/7mdnCDIDEn#SecureHTMLContainer #WebCrypto #HTML資料 #ClaudeCode
暗号化されたファイルをブラウザで開くと、こんな画面になる:
心当たりのない送信者からのファイルは開かないでください。
正しいパスワードを入力すると、確認画面が表示される。ファイル名・サイズ、そして作成者が設定していれば作成者名とメッセージが表示される。ここで「本当にこの人から送られたファイルか?」を確認してから、「ブラウザで開く」か「ダウンロード」を選べる。
動画・画像・音声・PDF・HTMLはブラウザ内でそのまま再生・表示できる。Excelなどブラウザで開けない形式はダウンロードされる。
Before → After
誰でも中身が読める
パスワード必須
7つの特徴
- どんなファイルでも対応 — HTML、PDF、画像、動画、Excel — ファイル形式を問わず暗号化HTMLに変換。メール添付で配布可能
- 完全ブラウザ完結 — 暗号化も復号もブラウザの
Web Crypto APIだけ。Node.jsもサーバーも不要 - 認証付き暗号 — AES-GCM により、暗号データの改ざんがあれば復号時に自動検知
- オフライン動作 — 暗号化・復号どちらもサーバーへの通信は一切なし。データは外部に送信されない
- 作成者情報の埋め込み — 暗号化時に作成者名とメッセージを暗号データ内に同封できる。受信者が「誰からのファイルか」を復号後に確認でき、フィッシング対策にもなる
- テーマカラー — ロック画面のアクセントカラーをカスタマイズ可能。ブランドカラーで「いつもの色だ」と直感的に判別できる
- インラインビューアー — 動画・画像・音声・PDF・HTMLはブラウザ内でそのまま再生・表示。ダウンロード前に中身を確認できる
3仕組み
暗号化ツール自体がHTMLファイル。ブラウザで開いて、ファイルをドロップしてパスワードを設定するだけ。
ドロップされたファイルを
ArrayBuffer として読み取るファイル名・MIMEタイプ・サイズ・作成者情報をJSON化し、ファイル本体と連結
salt + iv + ciphertext + authTag → Base64エンコード
※ v1.1でテキスト形式ファイルの自動圧縮に対応。対応形式や効果は暗号パラメータで後述
ロック画面 + 確認画面 + 暗号データ + 復号スクリプトを1つのHTMLに組み立て。テーマカラーはCSS変数として直接埋め込み
出力されるHTMLの構造
ソースを覗いても見えるのはロック画面のHTMLと、意味のないBase64文字列だけ。元のファイルは暗号の中にある。
4暗号パラメータ
| パラメータ | 値 | 理由 |
|---|---|---|
| 暗号アルゴリズム | AES-256-GCM | 認証付き暗号。暗号化と改ざん検知を同時に行う |
| 鍵導出 | PBKDF2-SHA256 | パスワード → 暗号鍵の変換。計算コストで総当たりを抑止 |
| 反復回数 | 600,000 | OWASP推奨レンジ相当 |
| Salt | 16バイト | 毎回ランダム。同じパスワードでも異なる鍵が生成 |
| IV | 12バイト | GCM標準のIV長(NIST SP 800-38D 推奨) |
| 認証タグ | 16バイト | 改ざん検知用。暗号文末尾に連結 |
鍵導出の流れ
password (ユーザー入力)
↓
PBKDF2(password, salt, 600000, 'SHA-256')
↓
AES鍵 (256ビット = 32バイト)
データ形式
暗号データは . で連結した文字列。基本3パート + オプションの4パート目:
base64(salt) . base64(iv) . base64(ciphertext + authTag) [. base64(preview_json)]
4パート目の preview_json は平文のJSONで、ファイル名・サイズ・作成者情報・テーマカラーを格納する。パスワード入力前にファイル情報を表示するために使われる。
テキスト自動圧縮(v1.1)
暗号データは Base64 でHTMLに埋め込むため、元ファイルより約33%大きくなる。v1.1 ではこの膨張を抑えるため、テキスト形式のファイルを暗号化前に自動圧縮する。
| 条件 | 値 |
|---|---|
| 対象MIME | text/*、application/json、application/xml、image/svg+xml |
| 拡張子フォールバック | .html .css .js .json .xml .svg .csv .txt .md .yml .php .sh .py .rb .java .c .cpp .ts .tsx .jsx .sql .log 等 |
| 最小サイズ | 10KB以上 |
| アルゴリズム | Deflate(CompressionStream API) |
| 圧縮率 | テキスト系で 60—80% 削減 |
圧縮の有無は preview_json の compressed フラグで管理される。復号側はフラグを見て DecompressionStream で展開する。バイナリファイル(PDF・画像・PPTX等)は圧縮対象外のため、従来と同じ動作になる。
5ブラウザ側の復号
復号はブラウザの Web Crypto API だけで完結する。外部ライブラリの読み込みは一切不要。
<script type="application/octet-stream"> を読む. で split → salt / iv / data(+ preview_json)に分離crypto.subtle.importKeycrypto.subtle.deriveKey で PBKDF2 → AES-256 鍵crypto.subtle.decrypt + authTag検証パスワード誤り時
AES-GCM は鍵が異なると認証タグの検証で必ず失敗し、例外をスローする。「部分的に復号された壊れたデータ」が表示されることはない。全か無か。
総当たり対策
- PBKDF2 60万回 — 1回のパスワード試行に数百ミリ秒。大量試行が非現実的
- 試行回数制限 — 最大10回。超過でフォームロック
- 指数バックオフ — 3回目の失敗から 2秒 → 4秒 → 8秒 → ... → 最大30秒
6使い方とFAQ
ツール自体が1枚のHTMLファイル。ブラウザで開くだけで使える。
HTMLファイルをダブルクリック。インストール不要
HTML、PDF、画像、動画、Excel — 50MB程度まで対応
作成者名・メッセージ・テーマカラー・プレビュー表示を設定できる。設定しなくても暗号化は可能
ボタンがプログレスバーに変化し、完了するとダウンロードボタンに切り替わる。タップしてファイルを保存
なぜ外部ライブラリを使わないのか?
CryptoJS 等を使えば実装は楽になる。だがCDN障害時に復号不能になるリスクがある。ブラウザの Web Crypto API はOS/ブラウザのネイティブ暗号実装を使うため、信頼性が高い。
なぜ Argon2 ではなく PBKDF2 か?
Argon2id はメモリハード関数で PBKDF2 より優れた鍵導出関数だ。だが Web Crypto API が Argon2 をサポートしていない。ブラウザ側で外部ライブラリなしに実装するには PBKDF2 が唯一の選択肢。反復回数 60万回で十分な総当たり耐性を確保している。
同じパスワードで2回暗号化すると同じ暗号文になる?
ならない。Salt と IV は毎回ランダム生成されるため、同じパスワード・同じファイルでも毎回異なる暗号文になる。
ファイルサイズが増えるのでは?
Base64埋め込みにより約33%増える。ただしv1.1でテキスト形式ファイルの自動圧縮に対応した。HTML資料やソースコードなら圧縮で60—80%削減されるため、Base64の膨張を差し引いても元ファイルより小さくなる。画像やPDFなど内部圧縮済みのファイルは圧縮対象外で、従来どおり約33%増となる。
7おわりに
必要な道具はすべて、すでにブラウザの中にあった。
Web Crypto API、AES-256-GCM、PBKDF2 — どれも全モダンブラウザに搭載済みの標準技術だ。サーバーも外部ライブラリも要らない。HTMLファイル1枚でツールが完結する。
AIでHTML資料を作る人が増えた今、「パスワードをかけて渡したい」は当然のニーズだ。Secure HTML Container はそのためのフォーマットだ。
HTMLにパスワードをかけたかった。方法がなかったから、作った。それだけの話だ🥴