← 暗号化のしくみに戻る

🔐 暗号化の技術仕様

Pushany のエンドツーエンド暗号化の方式、鍵の構成、サーバーが扱う情報を説明します。しくみの概要は暗号化のしくみをご覧ください。

2026年10月20日時点の実装に基づいています。

概要

使っている方式

用途方式概要
内容の暗号化AES-256-GCMIV は 12 バイトで、暗号化のたびに乱数で作成。項目と欄を AAD に含める
鍵の導出PBKDF2-HMAC-SHA256復元キー・共有リンクのパスワードから鍵を作る。塩は 16 バイトの乱数。回数は、自分で決めた復元キーと共有リンクのパスワードでは 1,000,000 回、それ以外は 300,000 回。共有リンクのパスワードは 8 文字以上
ロック付きノートの PINPBKDF2-HMAC-SHA256 + HKDF-SHA256PIN から 1,000,000 回で作った値と、保護用の鍵・サーバーの乱数から鍵を作る
共有RSA-OAEP3072 ビット、SHA-256。招待する相手にリスト・ノートの鍵を渡す
安全番号SHA-256公開鍵から作る 30 桁の数字。相手の公開鍵が変わっていないかを確かめる
エージェントの書き込みRSA-OAEP + AES-256-GCM書くたびに作る AES-256 の鍵で内容を暗号化し、その鍵を本人の公開鍵で暗号化する
端末の承認ECDH P-256 + HKDF-SHA256両方の端末が作る使い捨ての鍵ペアから、渡す鍵を暗号化する鍵を作る。確認コードは SHA-256 から作る 6 桁
招待リンクHKDF-SHA256URL に含める 32 バイトの乱数から鍵を作る
パスキーWebAuthn PRF + HKDF-SHA256パスキーの PRF の出力から鍵を作る
パスキーでのログインWebAuthn (ES256・EdDSA・RS256)パスキーの署名をサーバーで確かめる。challenge は 32 バイトの乱数で、使い捨て (10 分)
復元キー乱数 (120 ビット)Crockford base32 の 24 文字

鍵の構成

復元キー (端末の中だけ)
├─ PBKDF2 ─→ 暗号化の鍵 (最初の版)
│    ├─ 自分の項目・タグ・ファイル・連絡先の表示名
│    └─ 共有していないチェックリストの鍵
├─ PBKDF2 (別の塩) ─→ 保護用の鍵
│    ├─ 暗号化の鍵の新しい版
│    ├─ 共有したリスト・ノートの鍵
│    ├─ 鍵ペアの秘密鍵
│    └─ 覚えた相手の安全番号
└─ PBKDF2 (別の塩) ─→ ロック付きノートの鍵 (PIN を忘れたとき用)

PIN + 保護用の鍵 + サーバーの乱数 ─→ ロック付きノートの鍵
     └─ ロック付きノートごとの鍵

鍵ペアの公開鍵
     ├─ 招待で相手に渡すリスト・ノートの鍵
     └─ エージェントが書いたもの

リスト・ノートの鍵
     └─ チェックリスト・共有できるノート・ロック付きノートの中身
鍵作り方・保存場所
復元キーアプリが作る 120 ビットの文字列か、利用者が決めた 12 文字以上の文字列。サーバーには送信しない
暗号化の鍵AES-256。最初の版は復元キーから作り、新しい版は乱数で作る。端末に保存する。サーバーには、復元キーか保護用の鍵で暗号化したものと、正しい鍵かを確かめるための値を保存する
保護用の鍵AES-256 の乱数。端末に保存する。サーバーには、復元キーで暗号化したものを保存する
鍵ペアRSA-OAEP 3072。利用者ごとに 1 組。サーバーには、公開鍵と、保護用の鍵で暗号化した秘密鍵を保存する
リスト・ノートの鍵AES-256 の乱数。チェックリスト・共有できるノート・ロック付きノートごとに 1 つ。使う人ごとに暗号化して保存する
ロック付きノートの鍵AES-256 の乱数。利用者に 1 つ。解錠している間だけ端末のメモリに置く。サーバーには、PIN・保護用の鍵・サーバーの乱数から作った鍵で暗号化したものと、復元キーで暗号化したもの、パスキーで解錠をオンにしたパスキーごとに PRF から作った鍵で暗号化したものを保存する
招待リンクの秘密32 バイトの乱数。URL の # より後ろだけにあり、サーバーには送信しない
共有リンクの鍵AES-256 の乱数か、パスワードから作った鍵。URL の # より後ろだけにある (パスワードは含まない)
承認用の鍵承認のたびに両方の端末で作る、使い捨ての鍵ペア
パスキーパスキーの PRF から作る。暗号化の鍵と保護用の鍵を暗号化して保存する。PRF に渡す値はすべてのパスキーで同じ (ログインのときに、どのパスキーが選ばれても 1 回で開けるように)

エージェントに内容の読み取りを許可している間は、サーバーが暗号化の鍵を保管します (サーバーで復号できる場合)。

暗号化の鍵の更新

共有

共有したチェックリスト・ノートの中身は、リスト・ノートの鍵で暗号化します。この鍵は、メンバーごとに本人の保護用の鍵か相手の公開鍵で暗号化して渡すため、サーバーは復号できません (例外はサーバーで復号できる場合と守る範囲と限界)。

ロック付きノート

新しい端末の承認

鍵のない端末 (B) に、鍵のある端末 (A) から暗号化の鍵と保護用の鍵を渡します。サーバーは中継するだけで、渡す鍵を復号できません。

  1. B が承認を求めると、アプリを開いているほかの端末に確認の画面が出ます。画面には、B の端末名・端末の種類・おおよその場所・日時を表示します。
  2. A で承認をはじめると、両方の端末が使い捨ての公開鍵を交換し、そこから 6 桁のコードを作ります。コードは B にだけ表示します。
  3. 利用者が B のコードを A で入力すると、A は端末の中で照合します。一致すれば、ECDH で作った鍵で渡す鍵を暗号化して送ります。一致しなければ要求を削除します。
  4. B は、受け取った鍵が正しいかを確かめてから保存します。承認したことはお知らせに残ります。

パスキー

設定で追加したパスキーで、ログインと暗号化の鍵の受け取りを一度に行えます。アカウントは Google・GitHub・X のどれかで作ります。

サーバーに保存するもの

暗号化して保存するもの

本文・タイトル・URL・タグ・ファイル名と種類・ファイルと添付の中身・リストの名前・色・アイコン・期限・メモ・セクション名・項目の文字とメモ・連絡先の表示名・覚えた相手の安全番号・タグの定義・ノートとリストの履歴の文字。

平文で保存するもの

並び替え・絞り込み・通知・共有に使うため、次のものは暗号化しません。

対象平文で保存するもの
項目種類 (ノート・リンク・ファイル・クリップボード)・書き方 (Markdown・リスト)・メモの印・作成・更新・編集・固定・ブックマーク・ゴミ箱の日時・トレイの期限・付箋の色・ファイルのサイズ・送信元と送り先の端末・中身の種類 (テキスト・リンク・画像・動画を含むか)・添付の数と大きさ・ロック付きかどうか
チェックリストの項目チェックの日時・並び順・フラグ・優先度・セクション・期限の日付と時刻・通知の設定・繰り返し・作成・更新の日時
リマインダー時刻・繰り返し・タイムゾーン・通知の言語・送り先の端末
共有メンバー・招待中の人・役割・@名、履歴の操作の種類と、誰がいつ操作したか
エージェント「名前を表示するリスト」に選んだリストと、「名前をエージェントに表示」がオンの共有しているリストの名前・エージェントの操作の記録 (操作の種類と対象の ID)・許可したエージェントの名前
アカウント・端末@名・ログイン方法ごとの ID・タイムゾーン・保存量・端末名と種類・最終使用の日時・API キーの名前・パスキーの名前と公開鍵・署名の回数・同期されるかどうか・暗号化の鍵の版・ロック付きノートの PIN の種類と続けて間違えた回数・承認を求めた端末の種類とおおよその場所
通知 (Web Push)項目の ID と種類だけを送ります。中身は端末が取得して復号します

このほかの通信の記録などは、プライバシーポリシーをご覧ください。

サーバー・運営者が見られないもの
  • 上の「暗号化して保存するもの」の内容
  • 復元キー
  • 暗号化の鍵 (下の例外を除く)
  • 保護用の鍵・秘密鍵・リストとノートの鍵 (下の例外を除く)
  • ロック付きノートの PIN と鍵
  • 招待リンク・共有リンクの # より後ろ
サーバー・運営者が見られるもの
  • 上の「平文で保存するもの」
  • 暗号文の大きさと、書き込みの日時・回数
  • 誰と何を共有しているか
  • 下の「サーバーで復号できる場合」の内容

サーバーで復号できる場合

端末に保存するもの

守る範囲と限界