親手解開你的備份
這頁的解密程序不是黑箱:同一套加密原語(金鑰包裹、Argon2id/PBKDF2 派生、AES-GCM)以 github.com/tacet-ink/journal-core 開源(MIT),本頁原始碼也完整可讀。你可以逐行檢視,也可以自己跑。
把應用裡「備份與帶走」匯出的加密備份檔貼進下面的框,輸入那個密語。如果你的備份因此顯出原文,就證明了:這串東西的鑰匙由密語決定,而整個過程不需要我們。
驗證的是什麼
這頁重放加密備份自身的解密程序(PBKDF2 60 萬次迭代派生金鑰、AES-GCM 解開包裹與內文),程式碼就在本頁原始碼與下方說明裡,你可以檢視後再使用。解開成功表示兩件事:
- 你的密語確實是唯一能解開這份資料的鑰匙,而且它在你的裝置上運作,不需要伺服器。
- 伺服器儲存層裡那串以
jr1b.開頭的內文(舊版jr1./純本地時代jr1u.同義),離開你的密語就只是雜訊。
零網路的證明
本頁的計數器攔下所有由瀏覽器發出的請求。沒有密語上傳、沒有遙測、沒有外部腳本;你可以開發者工具的網路面板自行複核,或離線開啟本頁後執行,結果不變。
格式說明
加密備份檔內含:每則內文的密文(jr1b. 前綴,舊版檔案為 jr1./jr1u.,AES-GCM,AAD 綁定篇章編號)、鹽、以密語包裹的金鑰(jr1w. 前綴)。v2 格式另帶附件(圖片與檔案):每件密文以 jr1c. 前綴、AAD 綁定篇章與附件編號(jr1a:),與內文用同一把金鑰;解開後圖片以 blob: 網址在你的瀏覽器本地渲染,檔案以下載連結給你的瀏覽器(download 語意),同樣零網路。解開順序:密語+鹽經 PBKDF2(600,000 次,SHA-256)派生金鑰包裹鑰匙(KEK)→ 解開 noteKey → 以 noteKey 解開每則內文與每件附件。前綴是版本契約:未來 KDF 參數升級時會換新前綴,舊檔仍以舊版規則可解。
補充口徑:v3 世代起匯出為 jr4w.(Argon2id),舊檔(jr1w./jr3w.)照舊可解;本頁與該契約一致,舊備份永遠可解。應用內的「帳戶登入包裹」自 2026-09 起已升級為記憶體困難的 Argon2id(舊帳戶下次登入自動升級),與備份格式各自獨立,兩者並行。詳見〈威脅模型〉。
同一份程式碼運行在應用本體(React)與本頁(純 JavaScript);驗證環境與應用環境的行為一致,正是這頁的目的。
這個方法的界限
它驗證的是「密文與包裹在密語正確時可解、在密語錯誤時不可解」,也就是儲存層的不可讀性。它不能證明伺服器不會送出竄改過的程式碼(見〈威脅模型〉的誠實界限),也不會替你記住密語。若輸入錯誤密語,這裡會顯示「解不開」,不會有第四次機會之外的重試提示。驗證部署層的下一層證據,見下方「可重現建置」一節。
為什麼要可重現建置
威脅模型的誠實界限裡寫過:如果營運者惡意,理論上可以送出竄改過的程式碼(送毒的 JS)去摘取金鑰。當時的緩解是「加密層的程式碼公開;這能緩解、無法根除」。可重現建置把這條緩解補上實質證據:不只程式碼公開,線上正在執行的那份程式碼本身可以由任何第三方從源碼重現。重現結果與線上檔案逐位元組一致,表示線上的檔案就是源碼建出來的那份:營運者若想在部署時塞進私貨,換掉任何一個位元組,比對就會失敗。這仍是緩解、無法根除(界限見本節末),但它把「信不信營運者的良心」換成「信不信你手上跑得出來的雜湊」。
線上現行版次
這兩行由部署流程在建置與部署時自動烙印,不由人工手抄。你的瀏覽器載入這頁時看到的值,就是你下載的主程式檔名與它的 SHA-256;親手重現後比對這兩行即可。版次戳的形是 v0.1.0+<7 碼 git 版次>(工作樹有未提交變更時加 .d),由建置流程自動從 git 產生,烙進程式裡。
親手重現的步驟
以下步驟照 REPRODUCING.md(源碼庫根目錄)收斂成可操作版。已實測:同一版次、同一鎖定檔,在不同目錄全新建置,產出與線上逐位元組一致。需要的環境與版本:node 26.8.1、npm 11.19.0(engines 精確釘選,.nvmrc 同步);依賴以 package-lock.json 全鎖,npm ci 安裝(不要用 npm install,它會按 ^ 範圍浮動)。
- 單一 clone 即可:密碼學核心由
npm ci隨依賴一起安裝(套件@tacet-ink/journal-core,版次由package-lock.json鎖定),不需要特殊目錄佈局。核心開源(MIT):github.com/tacet-ink/journal-core。 - 在 tacet 目錄:
nvm use(讀.nvmrc取 26.8.1)。 npm ci:嚴格按package-lock.json還原依賴。npm run build。- 比對雜湊:對
dist/assets/index-*.js算 sha256;再抓線上主程式(本頁「線上現行版次」的檔名)逐位元組比對,兩個 SHA-256 字串相等即一致。
mkdir tacet-build && cd tacet-build git clone <tacet-repo-url> tacet git clone https://github.com/tacet-ink/journal-core.git core cd tacet nvm use npm ci npm run build find dist -type f | sort | xargs sha256sum > dist.sha256 # 與本頁「線上現行版次」的檔名與 SHA-256 比對
誠實的界限(可重現建置)
這個機制能緩解、無法根除。你仍需要信任這一頁所寫的步驟與數值:本頁本身、它的部署,同樣出自營運者的伺服器;一個惡意營運者理論上可以在頁面上展示假雜湊。遞迴限制存在:徹底的第三方驗證不能只讀這一頁,要照步驟親手跑一次,用你自己算出的雜湊對線上檔案比對。獨立第三方重放後,這份信任才落地。另外,tacet 應用層的源碼尚未公開(tacet-ink/journal-core 密碼學核心已開源;本頁可瀏覽器本地重放加密備份的解密程序)。跨 node/vite 大版本與跨作業系統的重現未驗證,目前基準是 Linux x64。