密碼學與信任

安全模型

iOS 與 Android 版 Revault 的技術參考:本機保險庫、裝置金鑰、原生雲端同步與獨立分享如何保護你的資料,以及這些保護的界限。

技術參考 · 2026 年 10 月更新

保護在上傳之前就已開始

原生保險庫在本機運作,不需要 Revault 帳號。檔案內容、檔名、MIME 類型、縮圖、保險庫名稱、資料夾、標籤與我的最愛,都在裝置上加密。本機使用不會將保險庫檔案上傳到 Revault。原生雲端同步與分享是選用且各自獨立的操作。

此模型假設在建立或解鎖保險庫時,作業系統、已安裝的 App 與密碼學隨機來源皆值得信任。只拿到加密檔案與金鑰包裝的人,沒有所需的密語就無法解密。在保險庫開啟期間執行的惡意軟體或遭入侵的 App,可以擷取明文與金鑰。

你的裝置明文與保險庫金鑰
在本機加密經驗證的密文
加密儲存空間沒有明文的保險庫金鑰

每個保險庫都有獨立的金鑰

每個保險庫一開始都有隨機的 256 位元 AES 主金鑰,由作業系統的密碼學隨機來源產生。手勢並不直接決定這把金鑰。每個保險庫都有獨立的主金鑰資料,因此一個保險庫金鑰外洩,不會導出另一個。

裝置圖形會把有順序的點序列,與隨機的 256 位元裝置密語結合。產生的輸入以 NFKC 正規化,再交給使用全新 128 位元鹽值與 600,000 次迭代的 PBKDF2-HMAC-SHA-256 處理。衍生出的 256 位元金鑰,會以 AES-256-GCM 包裝主金鑰。App 不會儲存明文圖形,也不會儲存單獨的圖形指紋。

圖形使用 5 × 5 格線,包含六到 25 個不同的點,且在同一台裝置上登錄的各保險庫之間必須是唯一的。相符的圖形只會開啟其對應的保險庫;其他保險庫的名稱與內容仍保持隱藏。可預測的手勢仍然比較容易被猜到。同時取得裝置密語及其加密包裝的人,可以嘗試離線猜測圖形。

開啟原生保險庫需要其本機圖形或明確的復原流程,而不是 Revault 帳號或密碼金鑰 (passkey)。選用的雲端同步使用該平台的 Apple 或 Google 授權,商店購買則使用該平台的帳務帳號。雲端授權與購買行為都不會提供保險庫的解密金鑰。

密碼學參數
用途結構
保險庫主金鑰隨機的 256 位元 AES 金鑰
金鑰包裝PBKDF2-HMAC-SHA-256 · 600,000 次迭代 · 128 位元 salt → AES-256-GCM
中繼資料 (metadata) 與縮圖AES-256-GCM · 隨機 96 位元 nonce · 128 位元驗證標籤
檔案金鑰衍生HKDF-SHA-256 · 每個檔案隨機 256 位元 salt · 256 位元 AES 輸出
復原密語產生:18 個隨機單字(198 位元);自訂:至少 6 個不同單字,長度 32–512 個字元

僅限裝置的金鑰保護

在 iOS 上,裝置鎖定資料儲存為不同步的鑰匙圈 (Keychain) 項目,採用 WhenUnlockedThisDeviceOnly 保護。它只有在裝置解鎖時才能存取,也不會透過鑰匙圈同步轉移。儲存的密語不是 Secure Enclave 金鑰。

在 Android 上,裝置鎖定資料以不可匯出、且需要裝置處於解鎖狀態的 Android Keystore 金鑰,使用 AES-256-GCM 加密。加密後的鎖定檔案位於 App 的不備份目錄中。Keystore 的硬體支援取決於裝置;App 並不保證每台裝置都使用硬體支援的金鑰。

本機解鎖密語不包含在原生雲端同步與可攜式保險庫備份中。擁有 Apple 或 Google 帳號,並不能重建這些密語,也不會自動解鎖還原的保險庫。新裝置必須驗證獨立的復原密語,並登錄自己的圖形。

機密性與竄改偵測

保險庫中繼資料 (metadata)、檔案中繼資料、縮圖和包裝後的金鑰,使用帶有 128 位元驗證標籤的 AES-256-GCM。每次獨立的加密都使用全新的隨機 96 位元 nonce。解密時會先驗證標籤,才會傳回明文;被修改的密文或錯誤的金鑰會導致驗證失敗。

附加驗證資料 (AAD) 會將每個加密物件繫結到其格式版本、保險庫識別碼、物件識別碼和用途。例如,縮圖和檔案中繼資料 (metadata)紀錄使用不同的情境。將加密物件移到另一個保險庫,或用它取代另一個物件,都會改變驗證情境而導致驗證失敗。

驗證情境不會隱藏識別碼,也不能證明新鮮度。有效的舊紀錄仍然可能帶有有效的標籤。應用程式的修訂版本檢查可以偵測一般的並行更新,但這並不是對抗惡意服務重放完整舊狀態的密碼學防禦。

大型檔案使用經驗證的區段

原生檔案加密使用 Tink 所述的 AES-256-GCM-HKDF-SHA-256 串流結構。iOS 使用 CryptoKit 進行 AES-GCM 與 HKDF;Android 則使用平台的密碼學基本元件。每個新串流都有 40 位元組的標頭,包含其長度標記、隨機的 32 位元組鹽值與隨機的七位元組隨機數 (nonce) 前綴。

HKDF 會從保險庫主金鑰衍生出獨立的檔案加密金鑰。其情境包含保險庫和檔案識別碼、明文位元組長度,以及設定的區段大小。每個區段的 12 位元組 nonce 由隨機前置詞、四位元組的區段計數器和最終區段旗標組成。區段帶有 128 位元的 GCM 標籤。

原生 App 以約 5 MiB 的有界區段處理檔案。區段計數器、最後區段旗標與預期的位元組長度,可偵測遭竄改、重新排序或被截斷的區段。每個區段在使用前都會先驗證,而私人預覽只有在其檔案完成解密後才會發布。失敗時會捨棄不完整的輸出;重試則會傳輸現有的加密位元組。

此結構遵循 Tink AES-GCM-HKDF 串流規格。Revault 的實作與區段設定尚未經過獨立稽核,也未經 Tink 認證。

私人儲存空間、匯入與預覽

加密的保險庫檔案存放在 App 的私人儲存空間中。檔名、MIME 類型、資料夾、標籤、我的最愛與縮圖,都是經過驗證的加密紀錄。搜尋與標籤篩選在解鎖後,對使用中保險庫已解密的中繼資料進行;沒有明文的伺服器搜尋索引。

照片、影片與檔案的匯入,可以在加密前使用私人暫時暫存。保險庫內的相機拍攝不會自動儲存一份到相簿。從「照片」或其他服務供應商匯入時,會保留該供應商的原始檔案。選用的媒體最佳化在加密前於本機進行,且只會變更新匯入的媒體。

私人預覽在開啟期間需要暫時的明文。App 會在關閉、鎖定及後續啟動時,移除其暫時預覽;iOS 會對已解密的預覽檔案套用完整檔案保護。明確匯出到其他 App 的檔案,會脫離保險庫的保護。刪除暫存檔案並不保證以鑑識等級抹除。

選用的原生雲端同步

同步預設為關閉,並針對每台裝置上的每個保險庫分別啟用。iOS 將加密紀錄與檔案區段儲存在使用者 iCloud 中的私人 CloudKit 資料庫。Android 則使用 Google Drive 的私人 appDataFolder。這兩種傳輸都不需要 Revault 帳號,也不會將原生同步資料上傳到 Revault 的網頁雲端。

雲端收到的是加密的中繼資料、檔案區段與金鑰包裝,而不是明文的保險庫主金鑰、本機裝置密語或復原密語。同一平台上的另一台裝置,需要相同的原生雲端帳號與保險庫的復原金鑰,才能登錄自己的本機圖形。Apple 與 Google 的授權控制的是加密紀錄的存取,而不是解密。

關閉同步會停止目前裝置對該保險庫的後續傳輸;已存在的加密雲端副本會保留。同步的變更與刪除可能會傳播,同時發生的編輯也可能需要檢視衝突。iCloud 與 Google Drive 是各自獨立的儲存空間,沒有自動的跨平台橋接。若要在 iPhone 與 Android 之間移動,請使用加密的手機轉移。

復原是通往同一把金鑰的第二條路

產生的復原詞組包含從內建 2,048 字詞表中獨立選出的 18 個單字,提供 198 位元的隨機性。你也可以改為自訂詞組,須有至少六個不同單字,長度 32–512 個字元;其強度取決於你的選擇。兩者都會使用 PBKDF2-HMAC-SHA-256 和全新的 salt 獨立衍生出封裝金鑰,再以 AES-256-GCM 封裝同一把保險庫主金鑰。任何人只要取得詞組和加密保險庫,就能將其解密。

復原密語會在設定時顯示,不會保存在原生 App 的儲存空間中,也不會上傳到原生雲端儲存空間。請與加密檔案分開保管。登錄另一台裝置,需要來自原本原生雲端帳號的加密保險庫或加密備份,加上復原金鑰。密語無法還原遺失的檔案資料,Revault 也沒有由服務供應商持有的重設金鑰。

可攜式 .qvault 備份包含加密的金鑰包裝、經過驗證的加密清單與加密的檔案區段。其中不含本機裝置解鎖密語。匯入時會先驗證清單、中繼資料和每個區段,才還原到具有全新識別碼、主金鑰、檔案金鑰與新裝置圖形的保險庫中。還原後,請儲存新的復原金鑰。

新的復原詞組會保留大小寫、以 NFKC 正規化 Unicode,並合併多餘的空白。舊版十六進位金鑰仍受支援。儲存新詞組後,你可以在保險庫設定中更換復原詞組。這會取代目前的復原封裝;舊備份和尚未同步的裝置仍可能保留舊的封裝。變更圖形或復原詞組並不會輪替保險庫主金鑰,也不會撤銷既有副本。如果金鑰材料外洩,請將檔案移到使用全新金鑰的新保險庫。

加密的手機間遷移

手機轉移會建立可攜式的加密副本,具有全新的保險庫識別碼、主金鑰、檔案金鑰與串流標頭。其獨立的轉移密語無法解鎖來源保險庫,且不包含來源的復原密語與裝置解鎖密語。加密套件與轉移密語必須分開傳送。

接收端 App 會驗證套件及其檔案區段,然後還原到具有新本機圖形與新復原金鑰的新保險庫。這在 iOS 與 Android 之間也適用,不需要橋接雙方的雲端帳號。原始保險庫仍留在舊裝置上;在刪除之前,請先確認還原後的內容,並儲存新的復原金鑰。

鎖定與工作階段清理

行動版 App 在切換到背景時會立即鎖定,預設也會在閒置 60 秒後鎖定。每個保險庫可選擇 30 秒、1 分鐘、2 分鐘、5 分鐘或 10 分鐘。分享的保險庫使用 60 秒的預設值。退出會回到圖形畫面,並結束已解密的工作階段。

鎖定會取消工作階段中的作業、清除已解密的中繼資料與搜尋狀態、關閉預覽、移除暫存檔案,並在釋放前覆寫所擁有的金鑰緩衝區。暫時的衍生金鑰在使用後也會清除。Swift 與 JVM 的記憶體管理、密碼學函式庫與媒體解碼器可能會產生副本;無法保證立即抹除每一份副本。

iOS 會以隱私保護遮罩遮蓋 App 切換器快照。Android 使用安全視窗旗標,限制螢幕截圖與最近使用 App 的預覽。這些平台保護無法防止有人拍攝已解鎖的螢幕,也無法收回先前已匯出到其他 App 的檔案。

Revault Cloud

Revault Cloud 是用於跨平台同步的選用 Pro 儲存服務。加密區段與加密檔案中繼資料會連結到匿名化的計費安裝。此服務可看到儲存識別碼、大小、檢查碼、修訂版本與傳輸活動,但不會收到未封裝的保險庫金鑰或復原詞組。另一組隨機連線碼負責授權儲存空間存取;連接其他裝置時也需要復原詞組。Pro 到期後,現有雲端資料仍可讀取以供復原。

每次分享都有獨立的金鑰

原生分享是選定檔案的快照,而不是對擁有者個人保險庫的存取權。預設情況下,App 會衍生所選檔案版本的金鑰,並在全新的分享主金鑰下,以 AES-256-GCM 將它們包裝起來。它會重複使用已加密的檔案位元組,同時為分享重新加密中繼資料與縮圖。來源保險庫金鑰、其復原密語、資料夾結構、標籤與我的最愛都不包含在內。

每個分享都有獨立產生的 18 字解密詞組和復原封裝。寄件者會私下傳遞該密語,與邀請連結分開。伺服器收到的是加密資料,絕不會收到明文分享金鑰或解密密語。收件者無法從選定的檔案金鑰推導出未分享的檔案金鑰或來源保險庫主金鑰。

選用的額外隔離設定,會以全新的金鑰與串流標頭重新加密檔案內容。預設值較快,因為不必重寫每個檔案;重複出現的密文可能會讓同一檔案版本的副本產生關聯。兩種模式都會建立獨立的快照,也都無法收回收件人已保留的密文與金鑰。

原生分享的傳輸與存取控制

在 iOS 上,私人、唯讀的 CloudKit 邀請會把加密快照放在獨立的分享紀錄階層中,位於個人同步區域之外。Apple 控制邀請的存取;收件人仍需要另外的解密密語。CloudKit 邀請不會強制執行伺服器的存取工作階段次數、固定到期時間或自毀計時器。擁有者可以停止日後的 CloudKit 存取。

跨平台分享會將加密分段上傳到 Revault 的分享服務。各自獨立的隨機 256 位元讀取與管理權限,以 SHA-256 雜湊值儲存。網站連結在其片段 (fragment) 中帶有讀取權限,而不是解密密語。開啟後會深層連結到分享保險庫,並提示輸入寄件人的密語;不需要個人圖形或現有的保險庫。個人保險庫仍保持鎖定。

受控的伺服器分享會強制執行寄件人設定的存取工作階段上限、30 天內的固定到期時間、撤銷與選用的匯出權限。工作階段以原子方式授予,最長 15 分鐘,且受分享期限限制。工作階段一經授予就算一次存取,即使下載或解密失敗也一樣。檢視器會檢查持續中的存取,並在期限到時關閉。

SHA-256 檢查碼用來驗證傳輸的各個部分,驗證式加密則用來驗證其內容。允許匯出時,檢視者可以儲存一份以分享密語開啟的加密 .qvault 副本。停用匯出只會移除應用程式內的這項操作,並無法在密碼學上阻止螢幕截圖,也無法阻止被修改過的用戶端保留明文。刪除來源檔案並不會撤銷已另行建立的分享。

第一次存取之後的期限

寄件者可以啟用獨立的銷毀計時器。它會在伺服器授予第一次存取工作階段時以原子方式啟動,即使之後傳輸或解密失敗也一樣。之後的每個工作階段都共用同一個期限;重新開啟絕不會重設它。固定到期、銷毀時間和工作階段到期中最早的一個生效。到達期限時,服務會拒絕進一步讀取,並將密文排入刪除佇列,而原生檢視器則會關閉,並釋放其分享金鑰和暫存檔案。清理是非同步進行的,無法清除螢幕截圖、被修改用戶端保留的資料,或較早匯出的副本。

選用的保險庫活動紀錄

原生稽核紀錄預設為關閉,並在每台裝置上依保險庫設定。最近 500 筆本機事件,會以保險庫的主金鑰和專用的驗證情境加密。它們不含金鑰、解鎖圖形、檔案內容和其他保險庫的資料,不會同步,並可清除或停用。它們不是防竄改的證據。失敗的解鎖不會歸屬於任何保險庫。

啟用紀錄功能後建立的新受控分享,會在分享服務上保留最多 100 筆存取工作階段時間戳記。只有管理能力可以擷取它們;紀錄不含收件者身分或解密密語。停用本機紀錄只會影響之後的分享。既有分享的紀錄會保留其原本的設定,直到撤銷或到期並清理為止。

選用的加密入侵照片

擁有者可以在每台裝置上,分別為每個保險庫啟用入侵警示。連續三次不相符的解鎖圖形後,前景中的應用程式可以拍攝一張前置鏡頭照片,但需視權限、相機可用性和一分鐘的冷卻時間而定。系統的相機指示燈仍會顯示。最近十筆警示儲存在本機,絕不會加入「照片」或被上傳。不相符的解鎖圖形無法辨識目標保險庫,因此每個選擇啟用的保險庫都會收到一份獨立加密的裝置嘗試紀錄。

專用的 RSA-3072 公開金鑰,會使用搭配 SHA-256 和 MGF1-SHA-256 的 OAEP,為每筆警示包裝一把全新的 256 位元 AES-GCM 金鑰。這使得保險庫鎖定時也能進行加密。對應的私密金鑰本身,會以該保險庫的主金鑰和專用的驗證情境加密。只有解鎖該保險庫,才能解密其照片。警示會獨立於一般活動紀錄,顯示在其稽核檢視中,並可在入侵警示設定中清除。它們不是防竄改的證據。

安全退出會移除本機存取權

每台裝置上可以指定一個保險庫作為安全退出之用。輸入它的圖形後會正常開啟該保險庫,同時移除其他本機保險庫紀錄、加密區塊、裝置解鎖資料和排隊中的變更。App 會持續保留本機允許清單,讓同步無法悄悄地重新填入被排除的保險庫。已在傳送中的加密傳輸仍可能完成。

原生雲端副本以及其他裝置上的副本仍會保留。在設定新的本機圖形之前,必須先提供被排除保險庫的復原金鑰才能明確復原。若是沒有另外備份的僅限離線保險庫,可能會遺失。此設定僅適用於目前這次安裝,並不是使用同一個雲端帳號的所有裝置。

安全退出無法保證達到鑑識等級的清除或隱藏效果。快閃記憶體儲存空間、作業系統快取、備份和先前的匯出檔都可能留下痕跡。移除 App 資料或重新安裝,可能會移除本機隔離的界線;此後雲端紀錄可能會再次透過原生雲端帳號被發現。只有復原金鑰才能解鎖這些紀錄。

哪些資訊仍然可見

加密隱藏的是內容,而非所有營運資訊。本機紀錄和雲端供應商可以看到識別碼、紀錄之間的關聯、物件數量、大小、修訂版本、時間戳記、加密的金鑰封裝和串流標頭。識別碼採用 UUIDv7,並包含建立時間資訊;它們不是機密。Apple 或 Google 可以將原生同步活動與平台帳號關聯起來。

Revault 的受控分享服務可以看到加密封包大小、各部分檢查碼、到期設定、存取工作階段次數,以及選用的工作階段時間戳記,但看不到另外傳送的解密密語。CloudKit 分享會向 Apple 揭露邀請與參與者資訊。網路與營運紀錄可能暴露連線資訊。Revault 不提供匿名性,也無法抵禦流量分析。

HTTPS 保護傳輸中的網路請求。裝置上的驗證式加密則另外保護儲存在本機和雲端中的保險庫內容。無論是傳輸加密還是密文,都無法隱藏資料何時、在何處或傳輸了多少的所有事實。

使用情況分析

預設為啟用。Mixpanel 會收到功能使用事件和一組隨機的分析 ID。保險庫內容、名稱、圖形、金鑰和分享密語都不包含在內。你可以隨時為這個瀏覽器或裝置關閉分析。

保護在哪裡結束

已解鎖的保險庫必然會將解密後的資訊暴露給它的 App 工作階段。惡意軟體、遭入侵的作業系統或 App、旁人偷看螢幕,或不受信任的收件者都可能擷取這些資訊。僅存於裝置的金鑰儲存是額外的一道防線,並不能保證在裝置完全遭入侵時仍安全。一旦本機密語外洩,容易被猜到的圖形就不安全了。

加密無法防止雲端刪除、勒索軟體、遺失復原金鑰、供應商扣留紀錄,或整個先前有效的加密狀態被回溯。請保留獨立的加密備份,並在移除舊裝置之前先確認可以復原。撤銷存取權無法收回已被他人保留的螢幕截圖、匯出檔或副本。

Revault 尚未經過獨立安全稽核。這些是對已實作密碼學設計的說明,並非認證,也不是對每種入侵的保證。

現有的瀏覽器保險庫

本參考說明的是原生 App。既有的瀏覽器保險庫採用另一套帳號、裝置儲存空間與網頁雲端模型。瀏覽器專用的 S3 上傳和瀏覽器分享連結不屬於原生雲端同步。瀏覽器帳號不會讓你登入行動 App;請使用加密備份及其復原金鑰,將既有的瀏覽器資料移到原生保險庫。

安全與架構