パスワードと保護モード
BDF の文書を読める人を限る方法は 2 つあります。パスワードで暗号化した文書は、だれでも取得できますが、開けるのはパスワードを知っている人だけです。保護モードでは、サーバーが文書を手元に置いたまま、ログインした読者に数ページずつ、要求ごとの鍵で封印して渡します。
| パスワードで暗号化 | 保護モード | |
|---|---|---|
| 配り方 | 1 ファイル形式・分割形式のまま。Range 要求も CDN も使える | サーバーが区間(10 ページずつ)ごとに答える。答えは 1 人の読者の 1 回の要求のためのもの |
| 鍵 | パスワードから作る 1 つの鍵 | 要求ごとに、読者のブラウザとサーバーが使い捨ての鍵で合意する |
| 鍵が後で漏れたら | それまでに送った文書はすべて開ける | 記録された通信は封印されたまま |
| オフライン | パスワードがあれば読める | 読めない(端末に鍵を残すことになる) |
| サーバーが決められること | なし(ファイルを渡したら終わり) | だれがどのページを、どれだけの速さで読むか |
パスワード付きの入力と暗号化
パスワードで保護された入力(読み取りパスワード付きの Office 文書、ユーザーパスワード付きの PDF)は、パスワードで開いて変換します。BDF の出力は同じパスワードで暗号化します。Part ごとに封印する(AES-256-GCM)ので、Range 取得や分割形式はそのまま使えます。ビューアは WebCrypto で復号し、サーバーはパスワードを保存しません(spec §3.5)。
保護モード
サーバーは文書を手元に置き、ログインした読者に区間(既定で 10 ページずつ)ごとに渡します。区間はどれも、読者のブラウザがその 1 回の要求のために作った鍵ペアに封印し、その後はどちら側にも鍵が残りません。後でサーバーの鍵や読者のセッションが漏れても、記録された通信は開けません。要求に答えるのは Go の segment パッケージ、頼むのは @bdfkit/core の SegmentLoader で、レンダラの Worker は描くように頼まれたページを取りに行きます(spec §3.6、secure-reader)。
文書を読んでよい読者が画面に見えるものを写すことは止められません。また、サーバーは文書を平文で持っています。実際に動くサイトの例は secure-reader で、区間 1 つを封印する費用や、あきらめるもの(CDN の共有キャッシュ、オフラインの閲覧)もそこで説明しています。