Cryptile 的安全架構,逐層說明
Cryptile 以 AES-256-GCM 加密每個檔案、縮圖和索引,所用的金鑰在你的手機上由你畫的圖案產生。沒有帳號,沒有伺服器,開發者從不持有金鑰。
簡明的摘要請看安全性頁面。
我需要知道什麼?
- 你的圖案是每把金鑰的來源。 沒有它,就不會儲存任何可讀的內容。
- 大小和保險庫數量都經過模糊處理。 檔案經過填補,誘餌欄位隱藏了保險庫的數量。
- 你可以自行檢查。 加密核心公開讓任何人稽核(原始碼公開),並附有威脅模型和測試向量:github.com/jasonbrelsford/cryptile-core。
圖案如何變成金鑰?
- 圖案會被寫成格點大小,後面依序接著你碰到的格點。
- 它會與一組 32 位元組的裝置秘密混合,這組秘密存放在 iPhone 鑰匙圈中,只屬於這台裝置。
- PBKDF2-HMAC-SHA512 會在上面執行 600,000 次。每一次猜測都要付出這麼多運算。
- HKDF-SHA256 把結果拆成一把查找金鑰和一把包裝金鑰。
- 查找金鑰決定保險庫索引檔的名稱。包裝金鑰負責打開它。
索引裡存放著保險庫隨機產生的 256 位元主金鑰。HKDF 從它衍生出分別用於檔案、縮圖和索引的子金鑰。沒有任何金鑰會用於兩種用途。
檔案如何加密?
小型項目,例如縮圖和索引,會以 AES-256-GCM 和一個隨機 nonce 整體封存。
大型檔案使用 STREAM 結構,切成 1 MB 的區塊。每個區塊都有自己的 nonce,並記錄自己的位置以及是否為最後一塊。切掉、重排或替換區塊,都會讓解密失敗。
GCM 也會驗證每個標頭,所以被更改過的檔案會被拒絕,而不會被顯示。
大小和保險庫數量如何隱藏?
每個小型資料塊和每個檔案的最後一個區塊,都會填補到 64 KiB 的倍數。複製檔案的人只能看到大概的大小,看不到確切大小。
沒有保險庫清單。App 至少保留 8 個外觀和索引相同的欄位,有真有假,並在每次寫入時重新產生誘餌。沒有對應到任何欄位的圖案會開啟一個空的保險庫。
復原如何運作?
每個保險庫都有一組 9 個單字的復原短語,相當於 96 位元的隨機性。它會開啟保險庫的另一份復原副本,這份副本以由短語產生的金鑰封存。
iCloud 備份會原樣鏡像加密後的檔案。裝置秘密預設不在備份裡,所以光靠備份無法用來猜測圖案。
哪些內容有加密,哪些沒有?
有加密:照片、影片、檔案、備忘錄、縮圖、名稱、資料夾、喜好項目、辨識出的文字和照片位置。記錄誘餌和免費方案數量的小檔案,以裝置金鑰封存。
未經 Cryptile 加密:
- 設定。 自動鎖定時間、排序方式和備份開關不含任何秘密。
- 等待加入的分享項目。 在你打開保險庫之前,它們受 iOS 檔案保護。
- 容器的總大小和寫入時間。 10 GB 的保險庫看起來不會像 10 MB。
- 你匯出的任何內容。 存到「照片」或「檔案」的副本就在保險庫之外。
這能防範什麼?
- 在沒有你鑰匙圈的情況下複製 App 檔案的人。 他們拿到的是密文,也無法嘗試圖案。
- Apple,或 Apple 的資料外洩。 iCloud 存放的是密文,沒有金鑰。
- 竄改。 被更改或重排的資料會解密失敗。
- 我們。 我們沒有伺服器,也不持有金鑰,所以無法重設存取權。
這不能防範什麼?
- 過短的圖案。 圖案比密碼短語更弱。如果有人拿到你的檔案和鑰匙圈,4×4 格點上 6 個格點的圖案用 GPU 幾分鐘就能破解。請使用 8 個或更多格點。
- 已解鎖手機上的惡意軟體。 保險庫開啟時讀取記憶體的程式碼,不是任何 App 能對付的。
- 看著你畫圖案的人。 請在沒有人看得到你的手的地方畫。
- 同時遺失手機和復原短語。 保險庫就無法找回。沒有重設功能。
Plus 中的緊急圖案會銷毀裝置秘密,所以在還原之前,手機上沒有任何保險庫能打開。