安全
金庫是如何建造的,以及一旦被攻破會發現什麼。
最後更新日期:2026 年 9 月 21 日 · AssuredAuth,由 CircleRoll LLC 提供
這是 AssuredAuth 如何保護您儲存的雙重金鑰、密碼和銀行卡的公開說明。編寫方式旨在方便注重安全的讀者對照應用程式和已發布的測試向量(任何審查者均可透過 hello@assuredauth.com 索取)驗證每一項聲明。本說明僅陳述事實,不作任何誇大其詞:這裡沒有任何內容聲稱絕對安全,也沒有任何百分比的承諾。
簡而言之:保險庫存在於一個地方,那就是你的手機。其中的每個值都使用手機安全硬體保存且無法匯出的金鑰進行加密。我們不運行任何保險庫伺服器,不保存任何副本,也不持有任何密鑰。備份檔案只有在使用絕不儲存在任何地方的密碼短語加密後才會離開手機。
報告問題: hello@assuredauth.com. 請參閱文末的「報告缺陷」。
1. 加密的內容是什麼?使用什麼加密?
| 數據 | 在手機上 | 金鑰 |
|---|---|---|
| 雙重因子密鑰(TOTP/HOTP/Steam 種子) | 在手機上鑰匙圈(iOS)/ Android Keystore 支援的商店 | 金鑰平台的硬體綁定金鑰;資料庫行僅包含引用(secretRef),絕不包含種子。 |
| 密碼(密碼值、備註) | 在手機上密封行:AES-256-GCM,每個值使用一個隨機的 96 位元 nonce 值 | 金鑰一個隨機的 256 位元資料金鑰,其本身由第 2 節中的硬體金鑰封裝。 |
| 卡片資訊(卡號、有效期限、持卡人姓名、CVC碼) | 在手機上與密碼相同的安全印章;CVC 是可選的,並且只有在您輸入後才會儲存。 | 金鑰相同的資料金鑰 |
| 元資料(服務名稱、使用者名稱、圖示、排序方式) | 在手機上該應用程式的資料庫(SwiftData / Room) | 金鑰受作業系統文件加密保護;被視為非機密訊息 |
| 備份檔案(.authbackup) | 在手機上無論你把它放在哪裡:檔案、iCloud 雲端盤、Google 雲端硬碟 appData 資料夾、共用表單 | 金鑰密鑰由您的口令產生(§3)。蘋果和谷歌只會收到密封文件,不會收到其他任何資訊。 |
| Watch / Wear 配套 App | 在手機上手錶自備的鑰匙圈/加密共享偏好設定 | 金鑰手錶平台的密鑰;透過平台的配對裝置通道傳輸 |
| 桌面擴充流量(一次性程式碼按需提供) | 在手機上不儲存;以端對端加密信封的形式傳輸 | 金鑰每個金鑰對對應一個 X25519 金鑰對,私鑰位於金鑰鏈/金鑰庫;中繼節點只能看到密文。 |
診斷功能沒有接受密鑰的方法。任何分析事件都不會包含密鑰庫欄位。在任何版本中,密鑰庫中的任何值都不會寫入日誌。
2. 各平台上密鑰的存放位置
iOS。 資料金鑰由安全隔離區 (kSecAttrTokenIDSecureEnclave) 內產生的金鑰封裝,該金鑰具有存取控制權限 .privateKeyUsage + .userPresence、輔助功能 …ThisDeviceOnly,並位於應用程式共用的鑰匙圈存取群組中,以便自動填入程式可使用相同的金鑰擴充程式可以使用相同的金鑰擴充程式可以使用相同的金鑰擴充程式可以使用相同的金鑰擴充程式可以使用相同的金鑰擴充程式可以使用相同的金鑰擴充程式可以使用相同的金鑰擴充程式可以使用相同的金鑰擴充程式可以使用相同的金鑰擴充程式。應用程式、備份或偵錯器都無法從隔離區讀取私鑰;隔離區僅在使用者線上時(透過面容 ID、觸控 ID 或裝置密碼)才會同意使用該私鑰。 ThisDeviceOnly 表示手機的 iCloud 或 iTunes 備份不包含該金鑰;復原的手機初始狀態為空,需要輸入備份檔和密碼。沒有密碼的手機無法設定 .userPresence 密鑰(Enclave 拒絕創建該密鑰),模擬器也遵循同樣的設計(其存在提示是一個任何測試都無法回答的警報):在那裡,數據密鑰只是一個普通的僅限設備使用的鑰匙串項目——仍然不在任何備份中,手機鎖定時仍然無法讀取,但沒有第二個提示——“安全”屏幕設置。
安卓。 資料金鑰由 AndroidKeyStore 的 AES-256 金鑰封裝,該金鑰在裝置擁有 StrongBox 時產生(否則使用 TEE),並啟用了 setUserAuthenticationRequired(true) 和 30 秒的身份驗證有效期(在進行生物辨識或裝置憑證驗證後),以及 setUnlockedDeviceUnderal(Enad)。最後一個標誌僅用於驗證,而非承擔負載:Android 僅將其應用於每次使用都需要生物識別的密鑰,因此對於允許使用設備憑證的 30 秒有效期密鑰,它不會產生任何影響——防止陌生人訪問的原因是,註冊密鑰需要 PIN 碼,並且移除屏幕鎖定會使密鑰永久失效。密鑰庫密鑰不可匯出,且不包含在 Android 的雲端備份中。應用程式在其自身視圖中指定的網域名稱(webDomain)僅在已知瀏覽器中有效;對於任何其他軟體包,它還必須是系統已驗證的該軟體包的網域名稱(數位資產連結),因為任何應用程式都可以聲明任何網域。
這對被盜的資料庫檔案意味著什麼? SQLite 檔案和密封行都是密文。用於開啟它們的金鑰儲存在文件來源手機的安全硬體中,無法隨文件一起複製。離線狀態下無法猜測密鑰:資料密鑰是隨機產生的,並非人為設定。
3. 備份文件
備份是唯一會離開手機的數據,因此理論上,它是唯一可能遭受離線攻擊的地方。這種設計使得此類攻擊成本高昂,並盡可能地限制了攻擊者可以利用的資源:
- 密碼短語至少為 12 個字元(少於 12 個字元會顯示強度條)。
- 文件或應用程式中任何地方都不會儲存任何密碼提示。
- 對於寫入的每個文件,都會產生一個新的隨機 16 位元組鹽值和 12 位元組 nonce 值。
- 整個資料體採用 AES-256-GCM 加密,因此錯誤的密碼或損壞的檔案都會被拒絕,永遠不會被解密成垃圾檔案。
- 標頭(格式、版本、KDF 參數、鹽)作為附加的已驗證資料綁定到 GCM 標籤中,因此工作因子被編輯過的檔案無法開啟。
該文件為 JSON 格式,任何文字編輯器均可讀取;只有密文部分是不透明的。五年後,如果有人在應用程式已失效的情況下找到該文件,他們可以清楚地看到其加密方式,並使用 OpenSSL 或任何 Argon2 庫打開它。
格式 v1(隨 1.0 版本發布,仍可讀)
{
"format": "authbackup",
"version": 1,
"kdf": "PBKDF2-HMAC-SHA256",
"rounds": 600000,
"salt": "<base64, 16 bytes>",
"cipher": "AES-256-GCM",
"nonce": "<base64, 12 bytes>",
"ciphertext": "<base64>",
"tag": "<base64, 16 bytes>"
}
| 步驟 | 位元組 |
|---|---|
key | PBKDF2-HMAC-SHA256(passphrase as UTF-8, salt, 600000 rounds, 32 bytes) |
aad | UTF-8("authbackup:1:600000:") ‖ salt (原始的 salt 位元組,而非 base64 編碼) |
ciphertext, tag | AES-256-GCM(key, nonce, plaintext, aad); 標籤 16 字節,單獨存儲 |
plaintext | UTF-8 JSON,鍵已排序: {"accounts":[…],"exportedAt":"…Z","passwords":[…],"version":1} |
相容性說明:Android 1.0 寫入的是 v1 的變體-kdf 檔案全部小寫,沒有標籤金鑰(附加到密文的 16 位元組標籤),也沒有其他資料。兩個平台仍然會讀取這些檔案(當缺少標籤時:分割最後 16 個位元組,使用空的 AAD 開啟;kdf 檔案大小寫不區分地進行比較),現在都只寫入上述佈局。
格式 v2(目前版本;新備份的預設格式)
{
"format": "authbackup",
"version": 2,
"kdf": "Argon2id",
"memoryKiB": 65536,
"passes": 3,
"lanes": 1,
"salt": "<base64, 16 bytes>",
"cipher": "AES-256-GCM",
"nonce": "<base64, 12 bytes>",
"ciphertext": "<base64>",
"tag": "<base64, 16 bytes>"
}
| 步驟 | 位元組 |
|---|---|
key | Argon2id(version 0x13, passphrase as UTF-8, salt, m = 65536 KiB, t = 3, p = 1, tagLength 32, no secret, no associated data) |
aad | UTF-8("authbackup:2:argon2id:65536:3:1:") ‖ salt |
ciphertext, tag | AES-256-GCM(key, nonce, plaintext, aad); 標籤 16 字節,單獨存儲 |
plaintext | UTF-8 JSON,鍵已排序: {"accounts":[…],"cards":[…],"exportedAt":"…Z","passwords":[…],"version":2} |
Argon2id 是參考 C 實作(phc-winner-argon2,CC0),已在兩個平台上提供。在目前的手機上,64 MiB 的數據和 3 次迭代大約需要一秒鐘,並且每次猜測都會消耗相同的內存和時間——這是 PBKDF2 在 GPU 平台上所不具備的特性,也是 v2 版本存在的原因。讀卡機會忽略它不認識的金鑰,因此,如果使用 v2 版本的讀卡器,v1 版本根本無法辨識卡片。
證明
三個測試向量檔案(backup v1、backup v2 和 Argon2id)由第三方實作生成,該實作獨立於上述兩個應用程式(Node 的 OpenSSL 用於 PBKDF2 和 AES-GCM,以及在生成時根據參考實作的已發佈答案進行檢查的 WebAssembly Argon2id)。每個文件都包含密碼短語、鹽值、隨機數字、明文、派生金鑰、AAD、預期密文和標籤,以及完整的文件。 iOS 和 Android 上的單元測試讀取相同的檔案並斷言相同的位元組——因此,在一個平台上密封的備份檔案已被證明(而非假定)可以在另一個平台上打開,並且三個平台的測試結果一致並非同一錯誤的兩個副本。配套工具會開啟手機實際使用第三種實現方式寫入的文件,並根據上述規則檢查標頭(格式的鍵必須完全一致,因此不能包含提示或名稱;16 字節的鹽值、12 字節的 nonce 值和 16 字節的標籤分別存儲;版本 2 的大小正好是 64 MiB / 3 / 1;運行程式會在模擬器上寫入一個檔案並以這種方式開啟它,並在模擬器的應用程式容器、應用程式組容器和鑰匙圈資料庫中搜尋每個種子密碼和卡號的 UTF-8 和 UTF-16 編碼(0 個結果)。
4. 威脅模型
| 情況 | 他們擁有什麼 | 他們能得到什麼 |
|---|---|---|
| 手機遺失或被盜,已鎖定 | 他們擁有什麼設備、資料庫檔案、密封行 | 他們能得到什麼密文。封裝密鑰位於安全隔離區/保險箱中,只有在設備鎖定並輸入新的生物識別資訊或密碼後才能釋放。遠端清除手機資料(例如使用「尋找我的裝置」功能)會同時銷毀金鑰材料。 |
| 被盜的備份文件 | 他們擁有什麼來自雲端帳戶、電子郵件或筆記型電腦的 .authbackup 文件 | 他們能得到什麼使用至少 12 個字元的密碼短語派生的金鑰,並為每個檔案設定鹽值,採用 Argon2id 演算法,檔案大小為 64 MiB × 3 次(v2 版本),或 PBKDF2 演算法,迭代次數為 600,000 次(v1 版本)。不提供任何提示、使用者名稱或明文帳戶清單。每次猜測都需要重新進行密鑰派生;沒有捷徑可走。強密碼短語是這裡唯一的防御手段,應用程式的說明文件中也明確指出了這一點。 |
| 被竊設備,螢幕解鎖 | 他們擁有什麼你手裡拿著一部未解鎖的手機 | 他們能得到什麼代碼列表。保險庫(密碼、銀行卡)位於應用鎖定之後,並會根據自動鎖定計時器(立即/1分鐘/5分鐘)重新鎖定;解密後的值僅在螢幕顯示時才會存在於記憶體中。即使應用程式處於開啟狀態,自動填充和純文字匯出功能也會要求重新進行生物辨識。如果您擔心這種情況,請將應用程式鎖設定為「立即」。 |
| 同一部手機上的惡意應用程式 | 他們擁有什麼另一個應用程式的沙盒、剪貼簿、輔助功能或疊加技巧 | 他們能得到什麼它無法讀取我們的文件(平台沙盒機制)或使用我們的金鑰(金鑰與我們的簽名身分和用戶在線狀態綁定)。複製的內容會在 30 秒後從剪貼簿清除;在 Android 系統上,複製的內容會被標記為敏感訊息,並從剪貼簿歷史記錄中移除。在 Android 系統上,保險庫畫面會設定為 FLAG_SECURE 狀態(禁止截圖、螢幕錄製,切換器中顯示空白);在 iOS 系統上,切換器縮圖也會顯示空白。 Android 系統的自動填充功能僅提供給系統已驗證與已儲存網域名稱相符的應用程式(數位資產連結),因此不會向外觀相似的應用程式提供您的密碼。 |
| 釣魚頁面 | 他們擁有什麼一個看起來像你保存的網站。 | 他們能得到什麼沒有任何內容會被自動填入。匹配依據是可註冊網域名稱(公共後綴列表,已隨應用程式捆綁並更新):login.example.com 和 example.com 匹配,example.com.evil.net 和 examp1e.com 不匹配。應用程式內瀏覽器匹配方式相同,並且只會填充到請求的框架中,並在填充時再次檢查該框架的來源;對於沒有可註冊域名的主機(例如 IP 地址或本地網絡上的裸域名),只會進行精確匹配,不會有任何偏差。 iOS 自動填入功能也增加了 Apple 的關聯網域檢查。需要手動貼上到類似網域的密碼仍然存在風險;應用程式無法消除這種風險,只能避免提供輔助。 |
| 我們自己的伺服器 | 他們擁有什麼— | 他們能得到什麼沒有保險庫伺服器。 AssuredAuth 沒有帳戶,無需登錄,也沒有您的保險庫副本,因此我們這邊不會有任何您的資訊被竊取或破解。伺服器端運行著兩項服務,但這兩項服務都不會觸及您的保險庫:一是桌面擴展程序的中繼郵箱,用於存儲端對端加密的信封(一次性代碼,讀取後刪除;中繼郵箱永遠不會持有密鑰);二是可選的私有連接的出口伺服器,用於傳輸流量,但不保留任何訪問日誌。 |
| 傳票或政府請求 | 他們擁有什麼針對我們的法律程序 | 他們能得到什麼我們沒有任何可以交出的:我們沒有保險庫,沒有鑰匙,沒有密碼,也沒有備份。我們可以被迫這麼說;但我們無法被迫提供不存在的東西。 |
5. 剪貼簿、螢幕截圖和內存
- 複製作業會將內容複製到剪貼簿 30 秒,如果該內容仍屬於我們,則會清除內容。在 Android 系統中,剪貼內容會被標記為 EXTRA_IS_SENSITIVE,因此系統會將其從剪貼簿預覽和歷史記錄中隱藏;在 iOS 系統中,剪貼簿內容僅限本機使用(不會共用給其他裝置)。
- 在 Android 系統中,保險庫介面(密碼、密碼、卡片、卡片、密碼短語表、純文字匯出)會設定 FLAG_SECURE 標誌。 iOS 系統沒有對應的標誌;套用在切換器中會隱藏縮圖,預設情況下,這些標誌的值會顯示在眼睛圖示的切換按鈕後面。
- 解密後的值僅在螢幕顯示期間保存在記憶體中,螢幕消失或應用程式鎖定後即被釋放。資料密鑰會在每次請求時解包,不會在套用鎖定後繼續快取。
- 純文字匯出功能存在(因此您可以隨時離開),但需要確認表和新的生物識別訊息,其螢幕也帶有 FLAG_SECURE 標誌。
6. 自動填充:哪些內容會填充,哪些內容不會填充
| 在哪裡 | 密碼 | 卡片 |
|---|---|---|
| iOS:Safari 和應用程式(自動填充擴充功能) | 密碼是的,在擴充功能 (LAContext) 中重新輸入 Face ID/Touch ID/密碼後,並且僅針對保存條目的可註冊域名,並結合 Apple 的應用關聯域名檢查。 | 卡片不。 Safari 中的卡片自動填充功能是蘋果獨有的;卡片螢幕上顯示“在 AssuredAuth 瀏覽器中填充並使用 Copy 功能”,除此之外沒有其他承諾。 |
| Android:應用程式和 Chrome(自動填充服務) | 密碼是的,基於資料集的身份驗證:系統會在填寫資料之前顯示生物辨識提示;只有當數位資產連結將應用程式包與已儲存的網域關聯時,應用程式套件才會相符。 | 卡片是的,信用卡號、信用卡有效期限*和信用卡安全碼提示,都屬於同一個生物辨識門禁系統。 |
| AssuredAuth 瀏覽器(兩個平台) | 密碼是的,透過可註冊網域名稱——一個自身沒有任何完全匹配的主機——進入所要求的框架,在填充之前進行生物識別。 | 卡片是的,透過現場檢測,在填充前進行生物識別。 |
| 複製按鈕 | 密碼應用鎖後面是 30 秒剪貼簿 | 卡片號碼、有效期限、CVC(規則相同) |
在外形相似的宿主身上,什麼都填不進去。沒有生物辨識訊息,什麼都填不進去。
7. 永遠不會發生的事情
沒有保險庫伺服器。沒有包含保險庫欄位的分析工具。沒有確認表和新的生物識別訊息,無法匯出純文字。保險庫畫面上不載入第三方 SDK。不提供保險庫螢幕截圖。不提供密碼提示。任何版本均不記錄數值。
8. 我們無法防範的
一個弱到容易被猜到的密碼短語。一部作業系統根源已被攻破的手機(越獄或root後的裝置可以向應用程式謊報上述所有資訊)。打字時被人監視。貼上內容時桌面上的惡意軟體。我們這樣說,是為了讓大家明白以上清單的真正意義:設計可以移除的那些東西。
9. 審核狀態
該設計已針對兩個平台上已發布的已知答案以及其自身的跨平台向量進行了單元測試。在將該儲存庫上架商店之前,所有者計劃進行外部審查;在此之前,本文檔將在此處進行說明。
10. 各部分在哪裡執行
保險庫中的資料不會離開手機,但其中一些元件會在其他人的電腦上運作。以下是元件清單及其各自包含的內容;資料流的具體情況請參閱隱私權政策:https://assuredauth.com/privacy。
- Google Cloud / Firebase — 桌面擴充功能的中繼信箱(端對端加密信封,讀後刪除)、推播代幣、購買狀態以及透過聯絡表單傳送的訊息。
- Vercel — assetsauth.com,它的頁面以及背後的小功能。
- Vultr-私有連線的出口伺服器。流量透過它們傳輸;任何內容都不會被儲存。
- Apple Play 和 Google Play——在各自的商店中購買和訂閱。
- PostHog — 產品分析:統計使用情況,不涉及身分資訊。
- RevenueCat — 訂閱狀態:有效或已過期,以及所屬計畫。
每款產品都包含其對應的產品訊息,不包含任何來自其他管道的內容。產品更新時,產品清單也會隨之更新,本部分內容也會隨之更新。
回報安全弱點
如果您認為發現了本文所述任何方面的安全漏洞,請發送郵件至 hello@assuredauth.com,郵件主題為「安全」。請在郵件中註明平台、應用程式版本和操作步驟;使用您自己的資料進行測試即可,請勿使用他人的資料進行測試。我們不提供 PGP 金鑰;如果報告不適合以純文字郵件形式發送,請在第一封郵件中說明,我們會安排其他方式。
作為回報,我們承諾:我們將在三個工作天內確認收到您的訊息,並在處理過程中隨時向您匯報進展,在發布任何內容之前修正錯誤,如果您希望署名,我們會在此處註明您的姓名。對於在以下範圍內出於善意進行的研究,我們不會採取法律行動。
適用範圍:iOS 和 Android 應用程式、Apple Watch 應用程式、桌面擴充程式、assuredauth.com 及其 API。不適用範圍:App Store 和 Google Play 本身、上述服務提供者、任何形式的社會工程攻擊以及拒絕服務攻擊。
目前沒有賞金。對於舉報,我們會修復問題並表示感謝,而不是支付金錢。