LifeVeil 如何保护您的文件
本页用通俗的语言说明 LifeVeil 做了什么,也说明它做不到什么。我们宁愿让您了解它的局限,也不愿让您相信一个过大的承诺。
简而言之
- 所有加密都在您的手机上进行。没有 LifeVeil 服务器,也没有账号。
- 每个保险箱的文件都用一个随机密钥加密。只有该保险箱的图案(最高等级时还需其 PIN 码)、您添加的恢复短语,或您开启的指纹,才能解锁这个密钥。
- 每个图案都会打开一个保险箱。与任何已保存保险箱都不匹配的图案会打开一个空保险箱,在您向其中添加文件之前,不会写入任何内容。
- 我们开发者从不持有您的图案、PIN 码、短语或密钥。我们无法打开您的文件,也无法重置您的图案。
- 我们使用 Android 内置的加密功能和知名的 libsodium 库,没有自己编写加密算法。
- LifeVeil 尚未接受过独立的安全审计。
从图案到密钥
您在 5×5 网格上绘制图案,每个点只能用一次。新设置的图案至少需要 6 个点。LifeVeil 通过 Argon2id 将图案转换为密钥,该算法来自 libsodium(Android 上为 1.0.20 版)。
- 参数:64 MiB 内存、3 轮、1 条通道、256 位密钥。
- Argon2id 被刻意设计得很慢,每次猜测都需要大量内存。这让使用显卡进行猜测的成本高得多。
- 在我们的测试手机上,一次解锁大约需要 0.6 到 0.9 秒。
- 图案会与一个随机的 16 字节设备盐值混合。盐值存储在应用中,并用保存在 Android Keystore 中的密钥加密,该密钥无法从手机中复制出来。
- 除了与恢复短语一起保存的那份副本(见下文)之外,不保存图案的任何副本。应用通过尝试解锁密钥来验证图案。
- 您在点阵上方的 PIN 框中输入的任何内容,都会与图案一起进入同一个密钥派生过程。框中留空就表示只用图案。
安全等级
每个保险箱有一个等级。您在开始时选择,之后也可以在重新绘制图案后,在设置 > 保险箱 > 安全等级中更改。
- 最高安全(Ultra):图案加 6 到 8 位数字的 PIN 码,两者都只记在您的脑中。即使面对 AI 猜测也安全。忘记其中任何一个,保险箱都无法恢复。
- 1 级(推荐):仅图案。只要避开常见形状就安全。忘记后,保险箱无法恢复。
- 2 级:图案加写在纸上的恢复短语。忘记图案时您仍能重新进入,但捡到这张纸的人也能打开保险箱。
- 3 级:图案加指纹。最方便,但有人可能强迫您把手指按在传感器上。指纹只能用于一个保险箱。
文件如何加密
- 每个保险箱都有一个随机的 256 位主密钥。您的图案密钥和恢复密钥只用于“包裹”(加密)这个主密钥。
- 文件、缩略图以及您的项目列表(原始文件名、日期、大小)都以 AES-256-GCM 加密,使用的是 Android 内置的加密功能。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 个点的保险箱之前提醒您。
猜测可能需要多长时间
在应用内,每次尝试大约需要一秒,反复猜测会让每次解锁都变慢,最长 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 秒后锁定。
所有保险箱共用一个设备盐值
一部手机上的所有保险箱都使用同一个设备盐值。如果有人拿到了这个盐值,一次猜测就能同时测试所有保险箱。攻击单个保险箱的成本不变。
任何应用都无法阻止的情况
有人看着您绘制图案,或有摄像头拍下您的屏幕。
没有短语时,任何人都帮不了您
如果您忘记了没有恢复短语的保险箱的图案,或者同时丢失了图案和恢复短语,任何人都无法找回其中的文件,包括我们。