LifeVeil 如何保護你的檔案
這個網頁用淺白的文字說明 LifeVeil 會做什麼,以及它做不到什麼。與其讓你相信過大的承諾,我們寧願讓你了解它的限制。
重點摘要
- 所有加密都在你的手機上進行。LifeVeil 沒有伺服器,也不需要帳戶。
- 每個空間的檔案都是用隨機金鑰加密的。只有該空間的圖案(最高等級時再加上 PIN 碼)、你加上的復原詞組,或你開啟的指紋,才能解開這把金鑰。
- 每個圖案都會打開一個空間。與任何已儲存空間都不符的圖案會打開一個空的空間,在你加入檔案之前不會寫入任何內容。
- 我們開發者從來不會持有你的圖案、PIN 碼、詞組或金鑰。我們無法打開你的檔案,也無法重設你的圖案。
- 我們使用 Android 內建的加密功能和知名的 libsodium 程式庫,沒有自行開發加密方式。
- LifeVeil 尚未接受過獨立的安全性稽核。
從圖案到金鑰
你在 5×5 的格子上畫出圖案,每個點只能用一次。設定新的圖案時,至少需要連接 6 個點。LifeVeil 會使用 libsodium(Android 上為 1.0.20 版)的 Argon2id,將圖案轉換成金鑰。
- 設定:64 MiB 記憶體、3 次運算、1 條通道、256 位元金鑰。
- Argon2id 刻意設計得很慢,每猜一次都需要大量記憶體,因此用顯示卡猜測的成本會高出許多。
- 在我們的測試手機上,每次解鎖約需 0.6 到 0.9 秒。
- 圖案會與一組隨機的 16 位元組裝置鹽值混合。鹽值保存在應用程式中,並以存放在 Android Keystore 的金鑰加密,而這把金鑰無法從手機上複製出去。
- 除了與復原詞組一起保存的那一份(見下文)之外,應用程式不會儲存圖案的任何副本,而是透過嘗試解開金鑰來檢查圖案是否正確。
- 你在點陣上方的 PIN 碼欄位中輸入的內容,會和圖案一起用於同一次金鑰衍生。欄位留空時,就只使用圖案。
安全等級
每個空間有一個等級。你在開始時選擇,之後也可以在重新畫出圖案後,於「設定 > 空間 > 安全等級」中變更。
- 最高安全(Ultra):圖案加上 6 到 8 位數的 PIN 碼,兩者都只記在腦中。即使面對 AI 猜測也安全。只要忘記其中一項,空間就無法復原。
- 1 級(推薦):只用圖案。只要避開常見形狀就安全。忘記圖案的話,空間就無法復原。
- 2 級:圖案加上寫在紙上的復原詞組。忘記圖案時仍能重新進入,但撿到那張紙的人也能打開空間。
- 3 級:圖案加上指紋。最方便,但有人可能強迫你把手指放上感應器。指紋只能用於一個空間。
檔案如何加密
- 每個空間都有一把隨機的 256 位元主金鑰。你的圖案金鑰和復原金鑰只是用來「包裝」(加密)這把主金鑰。
- 檔案、縮圖以及你的項目清單(原始檔名、日期、大小)都使用 Android 內建的加密功能,以 AES-256-GCM 加密。GCM 也能偵測檔案是否被修改或調換。
- 應用程式內的檔案名稱都是隨機的。大型檔案會以 1 MiB 為單位分段加密,因此播放影片時,絕不會在儲存空間寫入未加密的副本。
- 對於 JPEG 相片,隱藏的詳細資料(EXIF,例如相機型號和日期)會另外保存,同樣經過加密。
- 應用程式鎖定時,會將記憶體中持有的金鑰全部覆寫為零。
復原詞組
- 復原詞組是選用的。只有在你選擇 2 級時,空間才會有詞組,並在你通過一個簡短測驗後儲存。
- 手機的安全隨機數產生器會選出 9 個英文單字。這些單字來自兩份各有 1,024 個常用單字的清單,並以 4 種固定順序之一排列,相當於 92 位元的隨機性。無論應用程式使用哪種語言,這些單字都是英文。
- 詞組會經過相同的 Argon2id 設定,並且能單獨解開主金鑰。它不需要裝置鹽值,因此即使圖案已經無法使用,詞組仍然有效。
- 手機上會保存一份詞組副本和一份空間圖案(及 PIN 碼)的副本,每一份都經過兩層加密:一層使用主金鑰,另一層使用 Android Keystore 金鑰。詞組打開空間時,應用程式會顯示一次圖案。應用程式鎖定後,就不會再保留在記憶體中。
- 變更圖案時,詞組維持不變。沒有詞組的空間,一旦忘記圖案就無法挽回。
指紋
指紋解鎖是選用功能,且只能用於一個空間。檢查指紋的是 Android,而不是 LifeVeil;應用程式從來不會收到你的指紋。主金鑰是由 Android Keystore 中的一把金鑰解開的,這把金鑰只有在剛通過高安全性生物特徵驗證後才能使用。如果有人在手機上新增指紋,這把金鑰就會失效,你必須再次使用圖案。
備份檔案
- 備份是一個
.lvb檔案。其中包含你那些已經加密的項目(維持原樣),以及經過包裝的主金鑰副本:一份對應你建立備份時畫的圖案,另一份對應復原詞組(如果空間有的話)。 - 圖案那一份每次備份都會使用新的隨機鹽值,而不是裝置鹽值。正因如此,你才能在新手機上打開備份。
- 檔案的標頭受到保護,因此任何修改或調換都能被偵測出來。
- 你可以透過 Android 本身的儲存畫面選擇存放位置。檔案絕不會經過我們。
- 還原時,用備份的圖案或詞組打開檔案,接著畫出新的圖案。還原後的空間一開始沒有復原詞組。
應用程式內的其他保護措施
- 所有畫面都會封鎖螢幕截圖、螢幕錄影,以及最近使用的應用程式清單中的預覽畫面。
- 根據預設,只要離開應用程式就會立即鎖定。你也可以改選 30 秒或 1 分鐘。
- Android 本身的雲端備份和手機間資料轉移不包含 LifeVeil 的資料,請改用備份檔案。
- 應用程式不會要求存取位置資訊、聯絡人或「所有檔案」的權限。
- 每個新圖案都會打開一個空的空間。沒有檔案的空間,不論是否已儲存,看起來都一樣,因此逼你開啟應用程式的人無法知道還有什麼。你可以在「設定 > 安全性」中關閉這項功能,之後無法打開任何空間的圖案就會顯示錯誤。
減緩猜測
由於每個圖案都會打開一個空間,猜測看起來就像是打開許多空的空間。LifeVeil 會在不顯示於畫面上的情況下減緩這種行為,而且每個圖案(包括正確的圖案)的等待時間都相同。
- 在 24 小時內,打開沒有檔案的空間達 10 次後,每次解鎖會增加 10 秒;達 20 次增加 60 秒;達 30 次增加 5 分鐘,這是上限。
- 出現自動化跡象時會直接套用上限:連續三次在不到 2 秒內完成圖案,或觸控來自協助工具服務或注入的輸入而非手指。
- 每經過 24 小時沒有打開空的空間,就會放寬一級。將手機時鐘調回過去並不會縮短等待時間。
- 這只在應用程式內有效,無法減緩有人用複製出的檔案在電腦上猜測(請參閱下方的限制)。
AI 與猜測圖案
- AI 無法跳過運算。每次猜測仍然必須以 64 MiB 記憶體執行 Argon2id。AI 無法破解 Argon2id 或 AES,所以每次猜測的成本都不會降低。
- AI 能改變的是猜測的順序。它可以學習人們偏好的形狀(字母、方形、常用的起始角落),並優先嘗試這些圖案。它也能協助從他人在你身後偷拍的影片,或螢幕上的指紋油漬,判讀出你的圖案。
- 因此,防禦重點在於圖案,而不是運算。應用程式會針對常見形狀發出警告。最高安全等級會再加上 6 到 8 位數的 PIN 碼,就算圖案被拍到也不夠。隱藏圖案軌跡則不會留下可被拍攝的線條。存放在 Android Keystore 中的裝置鹽值,能阻止在手機以外的地方進行猜測。
你應該知道的限制
沒有任何應用程式能防範所有情況。以下是 LifeVeil 的實際限制。
簡單的圖案可能被猜中
過短或常見的形狀(L、Z、一直線)可能被人從旁觀察、從螢幕上的油漬看出,或在幾次嘗試內猜中。實際上大家使用的圖案,比可能的圖案總數所暗示的還要容易猜中得多。請使用更多的點和更多的轉折。應用程式會針對非常簡單的圖案發出警告,在儲存圖案少於 6 個點的空間之前也會提醒你。
猜測可能需要多久
在應用程式內,每次嘗試約需 1 秒,而且重複猜測會讓每次解鎖變慢,最長 5 分鐘。但是,如果有人取得你的備份檔案,或從已 root 的手機取出裝置鹽值,就能改在電腦上猜測,而且不必等待。Argon2id 會拖慢這個過程,但圖案的可能組合遠比長密碼少。以一張高階顯示卡(RTX 4090 等級)每秒約 1,000 次猜測粗略估算:
| 猜測對象 | 可能組合數 | 所需時間(一張顯示卡) |
|---|---|---|
| 最常見的 10,000 種圖案 | 104 | 約 10 秒 |
| 所有 6 點圖案 | 1.28 × 108 | 約 1.5 天 |
| 所有 7 點圖案 | 2.42 × 109 | 約 28 天 |
| 所有 8 點圖案 | 4.36 × 1010 | 約 1.4 年 |
| 復原詞組(92 位元) | 4.95 × 1027 | 約 1.6 × 1017 年 |
以上為估算值,並非實測結果。圖案數量為上限值,實際使用的圖案遠少於此。硬體越多或越快,猜測速度就會等比例加快。最高等級的 PIN 碼會讓這些數字最多再乘以 108。
請妥善保管備份檔案
備份檔案不包含裝置鹽值,因此任何取得它的人都能如上所述離線嘗試圖案。請只存放在只有你能存取的地方,例如你自己的雲端帳戶,並使用較長的圖案。
復原詞組也會顯示圖案
持有空間復原詞組的人都能打開那個空間,應用程式接著會向對方顯示它的圖案和 PIN 碼。如果你在其他地方也使用相同的圖案(例如手機的螢幕鎖定),對方也會一併得知。請像保管檔案本身一樣妥善保管那張紙。
已 root 或遭感染的手機
如果有人能以應用程式的權限執行程式碼(例如在已 root 的手機上,或透過擁有完整控制權的惡意軟體),就能解開裝置鹽值並離線猜測。空間開啟期間,金鑰存在記憶體中,可透過 root 權限或偵錯工具讀取。Android 和 Flutter 內部產生的某些副本,以及畫面上顯示的相片,無法立即從記憶體中清除。
部分資訊是看得到的
應用程式儲存空間中加密檔案的數量、大致大小,以及建立或修改的時間,都沒有隱藏。手機上安裝了 LifeVeil 這件事也無法隱藏。
空的空間只能騙過畫面
能讀取應用程式檔案的人(例如在已 root 的手機上)可以數出空間資料夾的數量,也能看到這個設定已開啟。減緩機制對已儲存和未儲存的空空間一視同仁地計算,因此等待本身無法區分兩者。
偽裝只會改變主畫面
- 只有啟動器上的圖示和名稱會改變。手機的「設定 > 應用程式」清單、應用程式資訊和儲存空間畫面仍會顯示 LifeVeil。
- 螢幕閱讀器仍可能念出「LifeVeil」。例如 Samsung One UI 啟動器會將實際的應用程式名稱提供給 TalkBack,應用程式無法變更這一點。
- Android 的分享選單一律會顯示實際的應用程式名稱,因此切換圖示時,LifeVeil 會從分享選單中移除。你可以重新開啟。
- Android 的權限要求會顯示實際名稱,因此應用程式會在你切換圖示前先要求權限。
- 圖示變更期間,應用程式不會傳送通知。
- 偽裝代碼(4 到 8 位數)只會顯示鎖定畫面,無法打開你的檔案。代碼以加鹽雜湊的方式儲存,但可能的組合太少,一旦有人取得該檔案,很容易就能找出代碼。
指紋是較弱的解鎖途徑
指紋解鎖會略過 Argon2id,其強度取決於手機的指紋感應器和 Android Keystore。你隨時可以在「設定」中關閉這項功能。
相片詳細資料
- 對於 HEIC、PNG 和 WebP 相片,隱藏的詳細資料(EXIF)會留在檔案內,但整個檔案仍然經過加密。
- 在 Android 10 以上版本中,由於應用程式不要求位置資訊存取權,Android 會移除 LifeVeil 讀取的相片中的 GPS 位置。從相簿刪除原始檔案後,該位置資訊就會消失。
- 透過 Android 相片挑選器加入的相片,會依日期重新命名,因為挑選器不會提供原始檔名。
系統畫面開啟期間會暫停鎖定
系統畫面開啟期間(權限要求、刪除確認、相片或檔案挑選器、指紋提示),以及匯入或匯出進行中時,應用程式會暫緩鎖定。如果你已經離開應用程式,會在上述情況結束 2 秒後鎖定。
所有空間共用一組裝置鹽值
同一支手機上的所有空間都使用相同的裝置鹽值。如果有人取得這組鹽值,猜一次就能同時測試所有空間。攻擊單一空間的成本則不變。
任何應用程式都無法阻止的事
有人在旁看你畫圖案,或有相機正在拍攝你的螢幕。
沒有詞組,就沒有人能幫你
如果你忘記了沒有復原詞組的空間的圖案,或圖案和詞組都遺失了,沒有人能救回其中的檔案,連我們也不行。