<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>技術文章 — NT² 部落格</title>
    <link>https://blog.nt2.me/zh-TW/categories/tech</link>
    <atom:link href="https://blog.nt2.me/zh-TW/categories/tech/feed.xml" rel="self" type="application/rss+xml" />
    <description>深入探討 NT² Vault 背後架構與實作方式的技術文章。</description>
    <language>zh-TW</language>
    <lastBuildDate>Wed, 02 Sep 2026 00:00:00 GMT</lastBuildDate>
    <item>
      <title>挑戰－回應，而非以 email 作為持有憑證</title>
      <link>https://blog.nt2.me/zh-TW/key-did-challenge-response-auth</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/key-did-challenge-response-auth</guid>
      <pubDate>Wed, 02 Sep 2026 00:00:00 GMT</pubDate>
      <description>雲端服務常把 email 收件匣當成帳號的根。加密保管箱需要不同的證明：以簽署金鑰的控制權，透過回答一次性挑戰來展示。</description>
      <author>NT²</author>
      <category>authentication</category>
      <category>identity</category>
      <category>cryptography</category>
      <category>did</category>
      <category>security</category>
      <category>privacy</category>
      <category>cloud</category>
      <category>zero-knowledge</category>
    </item>
    <item>
      <title>每個分頁一個已解鎖保管箱——刻意如此</title>
      <link>https://blog.nt2.me/zh-TW/single-writer-multi-tab-vault</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/single-writer-multi-tab-vault</guid>
      <pubDate>Sat, 29 Aug 2026 00:00:00 GMT</pubDate>
      <description>在兩個瀏覽器分頁開啟同一個保管箱很平常。讓兩個分頁同時寫入同一份本機 SQLite 檔案則否。NT² Vault 選出一個寫入者，並讓其他已解鎖分頁當跟隨者。</description>
      <author>NT²</author>
      <category>architecture</category>
      <category>multi-tab</category>
      <category>local-first</category>
      <category>pwa</category>
      <category>sqlite</category>
      <category>broadcastchannel</category>
      <category>web-locks</category>
      <category>concurrency</category>
    </item>
    <item>
      <title>中繼資料在 SQLite，密文在 BlobStore</title>
      <link>https://blog.nt2.me/zh-TW/attachment-ciphertext-outside-sqlite</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/attachment-ciphertext-outside-sqlite</guid>
      <pubDate>Wed, 26 Aug 2026 00:00:00 GMT</pubDate>
      <description>保管箱需要知道哪些檔案屬於哪些項目、它們有多大、以及如何解開金鑰。 它不需要把那些加密位元組塞進負責回答這些問題的關聯式資料庫裡。</description>
      <author>NT²</author>
      <category>attachments</category>
      <category>sqlite</category>
      <category>blobstore</category>
      <category>opfs</category>
      <category>envelope-encryption</category>
      <category>local-first</category>
      <category>aes-gcm</category>
      <category>chunking</category>
    </item>
    <item>
      <title>標題用 FTS5；篩選勝出時走表掃描</title>
      <link>https://blog.nt2.me/zh-TW/fts5-vs-table-scan-in-the-vault</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/fts5-vs-table-scan-in-the-vault</guid>
      <pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate>
      <description>本機搜尋不是單一查詢形狀。自由文字需要標題與搜尋文字的全文索引。 類別、垃圾桶、封存等篩選需要一般的表條件。產品會切換策略， 讓介面不必把整個保管箱塞進記憶體，也能感覺可搜尋。</description>
      <author>NT²</author>
      <category>architecture</category>
      <category>local-first</category>
      <category>sqlite</category>
      <category>fts5</category>
      <category>search</category>
      <category>performance</category>
      <category>pwa</category>
    </item>
    <item>
      <title>永遠不要把整個保管箱載入 Svelte state</title>
      <link>https://blog.nt2.me/zh-TW/paged-list-not-full-table-load</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/paged-list-not-full-table-load</guid>
      <pubDate>Wed, 19 Aug 2026 00:00:00 GMT</pubDate>
      <description>本機保管箱可以保存數千筆結構化項目，卻不必變成巨大的記憶體內陣列。 耐用的真實資料留在 SQLite。介面只持有一分頁的輕量列表列， 並透過虛擬列表渲染。</description>
      <author>NT²</author>
      <category>architecture</category>
      <category>local-first</category>
      <category>sqlite</category>
      <category>svelte</category>
      <category>performance</category>
      <category>virtual-list</category>
      <category>pagination</category>
      <category>pwa</category>
    </item>
    <item>
      <title>帳號資料庫不能成為密碼神諭</title>
      <link>https://blog.nt2.me/zh-TW/no-password-oracle-in-d1</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/no-password-oracle-in-d1</guid>
      <pubDate>Sat, 15 Aug 2026 00:00:00 GMT</pubDate>
      <description>帳號資料表即使沒有任何保管箱項目的明文，仍可能形成危險的密碼測試介面。我們移除 了那些會讓資料庫副本變成離線猜測或還原系統的資料欄。</description>
      <author>NT²</author>
      <category>architecture</category>
      <category>security</category>
      <category>privacy</category>
      <category>zero-knowledge</category>
      <category>edge</category>
      <category>cloudflare</category>
      <category>d1</category>
      <category>authentication</category>
    </item>
    <item>
      <title>一個保管箱身份，一個同步中樞</title>
      <link>https://blog.nt2.me/zh-TW/vault-durable-object-per-key-did</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/vault-durable-object-per-key-did</guid>
      <pubDate>Wed, 12 Aug 2026 00:00:00 GMT</pubDate>
      <description>保管箱不必進入共用的明文信箱才能同步。它的公開密碼學身份可以指定專屬的邊緣協調器，用來通知 replica，並指向協調器本身無法開啟的加密 frame。</description>
      <author>NT²</author>
      <category>architecture</category>
      <category>sync</category>
      <category>privacy</category>
      <category>durable-objects</category>
      <category>key-did</category>
      <category>edge</category>
    </item>
    <item>
      <title>無法重設密碼，是刻意的設計</title>
      <link>https://blog.nt2.me/zh-TW/no-password-reset-by-design</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/no-password-reset-by-design</guid>
      <pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate>
      <description>「聯絡客服重設密碼」聽起來令人安心。對加密保管箱而言，它也透露了最終由誰控制存取權。NT² 選擇一項更難實現的承諾：還原材料由你保管，而不是放在我們的客服中心。</description>
      <author>NT²</author>
      <category>security</category>
      <category>recovery</category>
      <category>zero-knowledge</category>
      <category>trust</category>
      <category>local-first</category>
    </item>
    <item>
      <title>在邊緣進行盲目 replica 同步</title>
      <link>https://blog.nt2.me/zh-TW/blind-replica-sync-on-the-edge</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/blind-replica-sync-on-the-edge</guid>
      <pubDate>Wed, 05 Aug 2026 00:00:00 GMT</pubDate>
      <description>同步不必把本機保管箱變成雲端資料庫。邊緣可以辨識帳號、儲存不透明 replica frame 並傳遞更新，卻不必知道更新裡有什麼。</description>
      <author>NT²</author>
      <category>architecture</category>
      <category>sync</category>
      <category>privacy</category>
      <category>local-first</category>
      <category>zero-knowledge</category>
      <category>edge</category>
    </item>
    <item>
      <title>為什麼我們將保管箱的 SQLite 資料庫放在 OPFS，而非 IndexedDB</title>
      <link>https://blog.nt2.me/zh-TW/opfs-not-indexeddb-for-vault-sqlite</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/opfs-not-indexeddb-for-vault-sqlite</guid>
      <pubDate>Sat, 01 Aug 2026 00:00:00 GMT</pubDate>
      <description>SQLite 需要的是檔案。隱私保管箱需要耐用的關聯式儲存，而且隨著項目、索引與加密附件增加， 效能仍須保持穩定。以 IndexedDB 承載 SQLite 虛擬檔案系統，確實能連接這兩個世界， 但這座橋也會介入每一次資料庫操作。對 NT² Vault 而言，瀏覽器中的保管箱檔案應該放在 Origin Private File System。</description>
      <author>NT²</author>
      <category>opfs</category>
      <category>indexeddb</category>
      <category>sqlite</category>
      <category>wasm</category>
      <category>wa-sqlite</category>
      <category>local-first</category>
      <category>pwa</category>
      <category>browser-storage</category>
    </item>
    <item>
      <title>解鎖本機保管箱，不等於登入雲端</title>
      <link>https://blog.nt2.me/zh-TW/unlock-local-auth-cloud</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/unlock-local-auth-cloud</guid>
      <pubDate>Wed, 29 Jul 2026 00:00:00 GMT</pubDate>
      <description>同一個畫面，可能讓兩個安全事件看起來像一次登入。我們刻意將它們分開，因為開啟加密資料與向伺服器證明身份，是風險各異的兩件事。</description>
      <author>NT²</author>
      <category>authentication</category>
      <category>local-first</category>
      <category>privacy</category>
      <category>security</category>
      <category>cryptography</category>
      <category>cloud</category>
    </item>
    <item>
      <title>每個物件一把金鑰：NT² Vault 內的信封加密</title>
      <link>https://blog.nt2.me/zh-TW/envelope-encryption-cek-per-object</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/envelope-encryption-cek-per-object</guid>
      <pubDate>Sat, 25 Jul 2026 00:00:00 GMT</pubDate>
      <description>保管箱可以用一把金鑰加密所有資料，並且仍然宣稱資料經過加密。但我們希望採用更實用的邊界：每個項目與附件都有自己的內容加密金鑰，再由保管箱金鑰保護這些金鑰。</description>
      <author>NT²</author>
      <category>信封加密</category>
      <category>aes-gcm</category>
      <category>密碼學</category>
      <category>本機優先</category>
      <category>附件</category>
      <category>opfs</category>
      <category>安全性</category>
    </item>
    <item>
      <title>KDF 鹽值留在你的裝置上</title>
      <link>https://blog.nt2.me/zh-TW/kdf-salt-stays-on-device</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/kdf-salt-stays-on-device</guid>
      <pubDate>Thu, 23 Jul 2026 00:00:00 GMT</pubDate>
      <description>鹽值不是祕密，但它存放的位置，決定了誰能組成一套密碼猜測系統。NT² 將 KDF 鹽值與密碼驗證資料留在本機保管箱內，讓解鎖從頭到尾都在裝置上完成。</description>
      <author>NT²</author>
      <category>architecture</category>
      <category>crypto</category>
      <category>security</category>
      <category>local-first</category>
      <category>zero-knowledge</category>
      <category>web-crypto</category>
      <category>pbkdf2</category>
      <category>key-derivation</category>
    </item>
    <item>
      <title>一人如何與 AI agents 共同開發並營運 NT² Vault</title>
      <link>https://blog.nt2.me/zh-TW/one-person-ai-coding-agent-product-lifecycle</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/one-person-ai-coding-agent-product-lifecycle</guid>
      <pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate>
      <description>真正值得問的不是 AI agent 能不能寫 code，而是如何提供足夠的 context 與 autonomy， 讓 agents 快速前進，同時把產品決策、安全邊界、release 與 customer-facing actions 保留在明確的人類控制之下。</description>
      <author>NT²</author>
      <category>ai-agents</category>
      <category>human-in-the-loop</category>
      <category>spec-driven-development</category>
      <category>tdd</category>
      <category>devops</category>
      <category>security</category>
      <category>product-development</category>
    </item>
    <item>
      <title>為什麼選擇 PWA 本地優先、零伺服器的 Vault</title>
      <link>https://blog.nt2.me/zh-TW/why-pwa-local-first-zero-server-vault</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/why-pwa-local-first-zero-server-vault</guid>
      <pubDate>Mon, 13 Jul 2026 00:00:00 GMT</pubDate>
      <description>在雲端優先應用當道的時代，我們往往忽略了一個強大的替代方案：漸進式網頁應用（PWA）。當現代瀏覽器已經能在使用者裝置上完整執行高效、安全、高效能的應用時，為什麼還要維運一套沉重、昂貴且可能成為攻擊面的伺服器基礎設施？</description>
      <author>NT²</author>
      <category>architecture</category>
      <category>pwa</category>
      <category>privacy</category>
      <category>web-crypto</category>
      <category>sqlite</category>
      <category>wasm</category>
      <category>opfs</category>
    </item>
    <item>
      <title>多控保管箱與保管箱金鑰 DID：不用交出鑰匙的身份管理</title>
      <link>https://blog.nt2.me/zh-TW/threshold-vault-key-did-self-sovereign-identity</link>
      <guid isPermaLink="true">https://blog.nt2.me/zh-TW/threshold-vault-key-did-self-sovereign-identity</guid>
      <pubDate>Tue, 30 Jun 2026 00:00:00 GMT</pubDate>
      <description>自主身份聽起來很抽象。在 NT² 裡，實際版本更簡單：你的保管箱可以證明自己、在沒有客服介入下還原，並由你決定如何共用，而 NT² 始終保持盲視。</description>
      <author>NT²</author>
      <category>trust</category>
      <category>identity</category>
    </item>
  </channel>
</rss>