セキュリティを評価する方に向けた技術概要です。ここに書かれていることはすべてソースコードで確認できます。都合の悪い点も省かずに明記しています。
バックエンドはありません。本拡張機能は Manifest V3 の Chrome 拡張機能で、TOTP/HOTP コードを OTPAuth を使ってローカルで生成します。サーバーは運用しておらず、アカウントも保持せず、利用者のデータが当方に届く経路そのものがありません。
サーバーがない以上、サーバー側の鍵素材も、鍵の預託も、当方が管理する復旧手段も存在しません。パスワードを忘れ、リカバリーコードも失った場合、当方にできることはありません。これは設計上の選択です。
パスワード保護は任意で、既定では無効です。有効にした場合:
データをパスワード由来の鍵で直接暗号化することはありません。レコードを暗号化するのはランダムなマスターキーで、PBKDF2 の出力はそのマスターキーを包むだけです。ここから二つの結果が生まれ、どちらも重要です:
パスワード保護を有効にすると、識別子とフィンガープリントを除くアカウントレコード全体が暗号化されます。サービス名も対象なので、プロファイルを盗まれても、その人がどのサービスにアカウントを持っているかは分かりません。有効化の際は、レコードを暗号化し、復号して突き合わせることで検証したうえで、初めて平文のコピーをすべて削除します。ブラウザーのローカルストレージ、同期、そして 7 世代のローテーションバックアップのすべてが対象です。
評価に関わる点なので、率直に記します:
要するに、これが守るのは保存状態のデータです。使用中の時点ですでに攻撃者の制御下にある端末を守ることはできませんし、できるとも言いません。
マニフェストが宣言する権限は五つで、ホスト権限はありません:
コンテンツスクリプトは一切なく、tabs・cookies・webRequest の権限、web-accessible resources のいずれもありません。あなたがそのページでコードを求めるまで、私たちのものは何一つページに存在しません。そのとき動くものは、その一つのタブとその一回の呼び出しのために、あなた自身のクリックが与える許可のもとで注入され、あとには何も残りません。
カメラによる QR 読み取りは、ポップアップではなくタブで開いた拡張機能ページ上で動作します。ポップアップはフォーカスを失うと破棄され、権限ダイアログはまさにそれを引き起こすからです。これにはマニフェスト上の権限は不要です。ブラウザー標準のカメラ許可ダイアログを使い、拡張機能のオリジン単位で付与され、サイトの設定から取り消せます。スキャナーを開くまで要求されることはありません。映像はローカルでデコードされ、送信も保存も一切されません。
自分から通信するのは時刻の確認だけで、以下のそれ以外はすべて利用者がクリックした結果として発生します。Manifest V3 はリモートコードを禁じており、ここに挙げたもののいずれもアカウント・秘密鍵・生成されたコードを運びません。全一覧は次のとおりです:
| ホスト | タイミング | 利用者データを含むか |
|---|---|---|
| time.akamai.com timeapi.io cloudflare.com | 時刻のずれの確認。キャッシュあり。どの取得先にも届かない場合は設定にその旨が表示されます。時刻がずれると TOTP は成立しません。 | 含まない |
| authenticator.sh | インストール時のようこそページ、アンインストール時のフィードバックページ、ポップアップから開いたときのヘルプ・サポートページ。 | 含まない(通常の Web サーバーログのみ) |
| chromewebstore.google.com | ストアの掲載ページ。クリックしたときだけタブで開きます。評価の案内からはレビュー欄、クロスプロモーションのバナーからは当社のパスワードマネージャー。 | 含まない(Google からは通常のストアページ閲覧と同じに見えます) |
| authenticator.featurebase.app | 公開の要望ボード。サポート欄の機能リクエストのリンクからタブで開きます。 | 利用者がそこに投稿した内容のみ。第三者のサービスで、その規約が適用されます。 |
フォント・スクリプト・スタイル・画像のいずれも第三者ホストからは読み込みません。画面表示に必要なものはすべてパッケージ内に同梱されています。
以上のどれも、こちらを信用して受け入れる必要はありません。本拡張機能はオープンソースで、各リリースは再現可能です:
.crx をダウンロードして展開するnpm ci && npm run build を実行するdist/ と展開したパッケージを比較する生成された dist/ 内の全ファイルの SHA-256 を、各 GitHub リリースに SHA256SUMS-v<version>.txt として sha256sum 形式で添付しています。したがって手順 4 は sha256sum -c を一度実行するだけで済みます。差分はアーカイブ内のファイル順序と、Node のパッチバージョン差による minify 出力の空白に限られるはずです。
実行時の依存は意図的に少なく、OTPAuth・React・jsQR・Zustand・Framer Motion・Lucide のみで、コミット済みのロックファイルで固定しています。CycloneDX 形式の SBOM はご要望に応じて提供します。
ソースコードを見る当方は小規模な独立ベンダーです。次のいずれかが貴組織の必須要件であれば、評価を三週間進めた後よりも今知っていただくほうが良いはずです:
その代わりに提供できるのは、ソースコードの完全な公開、検証可能なビルド、最小限の権限、そしてそもそも貴組織のデータを保持しうるサーバー基盤が存在しないという事実です。
脆弱性の報告およびセキュリティに関するお問い合わせは security@authenticator.sh まで。開示ポリシー、対象範囲、応答時間、セーフハーバー条項はセキュリティポリシーのページに、何が保存され何が端末の外に出るのかはプライバシーポリシーに記載しています。
書面のベンダー評価アンケートへの回答や、セキュリティチームとのコードの読み合わせにも喜んで応じます。
セキュリティ以外の件(インストール、アカウントの復旧、導入に伴う請求関連など)はサポートをご覧ください。脆弱性の報告をそちらに送るのはお控えください。あの窓口は機密として扱っていません。