LifeVeil 如何保护您的文件
本页用通俗的语言说明 LifeVeil 做了什么,也说明它做不到什么。我们宁愿让您了解它的局限,也不愿让您相信一个过大的承诺。
简而言之
- 所有加密都在您的手机上进行。没有 LifeVeil 服务器,也没有账号。
- 您的文件用一个随机密钥加密。只有您的图案、恢复短语或指纹才能解锁这个密钥。
- 我们开发者从不持有您的图案、短语或密钥。我们无法打开您的文件,也无法重置您的图案。
- 我们使用 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 中的密钥加密,该密钥无法从手机中复制出来。
- 不保存图案的任何副本。应用通过尝试解锁密钥来验证图案。
- 连续输错 5 次图案后,您必须等待 30 秒。此后每多错一次,等待时间就翻倍,最长 16 分钟。
文件如何加密
- 每个保险箱都有一个随机的 256 位主密钥。您的图案密钥和恢复密钥只用于“包裹”(加密)这个主密钥。
- 文件、缩略图以及您的项目列表(原始文件名、日期、大小)都以 AES-256-GCM 加密,使用的是 Android 内置的加密功能。GCM 还能检测文件是否被修改或调换。
- 应用内的文件使用随机名称。大文件按 1 MiB 分块加密,因此播放视频时从不需要把未加密的副本写入存储空间。
- 对于 JPEG 照片,隐藏的详细信息(EXIF,例如相机和日期)会单独存储,同样经过加密。
- 应用锁定时,会用零覆盖它在内存中持有的密钥。
恢复短语
- 创建保险箱时,手机的安全随机数生成器会选出 9 个英文单词。这些单词来自两个各含 1,024 个常用词的词表,并按 4 种固定顺序之一排列。这相当于 92 位的随机性。无论应用使用哪种语言,这些单词都是英文。
- 短语使用同样的 Argon2id 参数,能独立解锁主密钥。它不需要设备盐值,因此即使图案已无法使用,它依然有效。
- 短语的一份副本存储在手机上,经过两次加密:一次用主密钥,一次用 Android Keystore 密钥。重新绘制图案后,您可以在“设置”中查看它。
- 当您更改图案或使用短语重新进入时,您会得到一组新短语。旧短语将失效。
指纹
指纹解锁是可选的。指纹由 Android 验证,而不是 LifeVeil;应用从不接收您的指纹。主密钥由 Android Keystore 中的一个密钥解锁,这个密钥只有在刚刚通过强生物识别验证后才能使用。如果有人在手机上添加了新指纹,这个密钥就会失效,您必须重新使用图案。
备份文件
- 备份是一个
.lvb文件。它按原样包含您已加密的项目,另外还有两份包裹好的主密钥副本:一份对应您制作备份时绘制的图案,一份对应您当时的恢复短语。 - 图案副本每次备份都使用一个新的随机盐值,而不是设备盐值。正因如此,您才能在新手机上打开备份。
- 文件头受到保护,任何修改或部分调换都会被检测到。
- 您通过 Android 自带的保存界面选择保存位置。文件从不经过我们。
- 恢复时,用备份对应的图案或短语打开文件。然后您需要绘制新图案,并会获得一组新的恢复短语。
应用内的其他保护
- 所有界面都会阻止截屏、录屏以及最近使用的应用列表中的预览。
- 默认情况下,离开应用后会立即锁定。您也可以改为 30 秒或 1 分钟。
- Android 自带的云备份和手机间数据迁移不包含 LifeVeil 的数据。请改用备份文件。
- 应用不会请求位置信息、通讯录或“所有文件”访问权限。
- 图案错误时显示空保险箱。画出无法打开任何保险箱的图案时,会打开一个空保险箱而不是报错,逼你打开应用的人无法知道还有什么。错误次数照样记录,入侵者照片照样拍摄,等待时间也照样生效。可以在设置 > 安全 > 图案错误时显示空保险箱中关闭。
AI 与图案猜测
- AI 无法跳过计算。每次猜测仍需运行使用 64 MiB 内存的 Argon2id。AI 无法破解 Argon2id 或 AES,因此任何一次猜测都不会变得更便宜。
- AI 改变的是猜测的顺序。它可以学习人们偏爱的形状(字母、方形、常用的起始角落),并优先尝试这些形状。它还可能帮助人从身后偷拍的视频或屏幕上的指痕中识别出图案。
- 因此,防护的重点在于图案,而不在于计算。强度提示会对常见形状发出警告。图案 + PIN 会增加一个 4–6 位数字的 PIN,这样仅凭视频里看到的图案还不够。隐藏图案线 不留下可被拍到的线条。Android Keystore 中的设备盐值可阻止在手机之外进行猜测。
您应该了解的局限
没有任何应用能防范一切。以下是 LifeVeil 如实说明的局限。
简单的图案可能被猜中
简短或常见的形状(L 形、Z 形、一条直线)可能被人通过偷看您操作或屏幕上的指痕猜出,也可能几次尝试就被猜中。实际使用的图案比可能的图案总数所显示的要容易猜得多。请使用更多的点和更多的转折。应用会对非常简单的图案发出警告。
猜测可能需要多长时间
在应用内,每次尝试大约需要一秒,输错 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 年 |
以上为估算值,而非实测值。图案数量是上限;实际使用的图案要少得多。硬件越多或越快,猜测速度就会按比例提高。
请勿让他人获得您的备份文件
备份文件不包含设备盐值,因此任何拿到它的人都可以像上面所示那样离线尝试图案。请只把它存放在只有您自己能访问的地方,例如您自己的云账号,并使用更长的图案。
已 root 或被感染的手机
如果有人能以应用的权限运行代码(例如在已 root 的手机上,或通过拥有完全控制权的恶意软件),就能解锁设备盐值并离线猜测。保险箱打开期间,密钥位于内存中,可通过 root 权限或调试器读取。Android 和 Flutter 内部生成的一些副本,以及屏幕上显示的照片,无法立即从内存中清除。
有些信息是可见的
应用存储空间中加密文件的数量、大致大小,以及它们的创建或修改时间都不会被隐藏。已安装 LifeVeil 这一事实也不会被隐藏。
空保险箱只能骗过屏幕
能读取应用文件的人(例如在已 root 的手机上)可以数出保险箱文件夹的数量,也能看到这个设置已打开。另外,图案错误 5 次后应用会要求等待,这说明之前的图案什么也没打开。
更换图标只改变主屏幕
- 只有启动器中的图标和名称会改变。手机的“设置 > 应用”列表、应用信息和存储空间界面仍会显示 LifeVeil。
- 屏幕阅读器可能仍会读出“LifeVeil”。例如,Samsung One UI 启动器会向 TalkBack 提供真实的应用名称,应用无法改变这一点。
- Android 的分享菜单始终显示真实的应用名称,因此更换图标时,LifeVeil 会从分享菜单中移除。您可以重新开启。
- Android 的权限请求会显示真实名称,因此应用会在您更换图标之前请求权限。
- 图标更换期间,应用不会发送通知。
- 开启代码(4 到 8 位数字)只会打开锁定屏幕,不会打开您的文件。它以加盐哈希的形式存储,但由于可能的组合太少,如果有人拿到该文件,很容易就能找出代码。
指纹是较弱的途径
指纹解锁会跳过 Argon2id。它的强度取决于您手机的指纹传感器和 Android Keystore。您可以随时在“设置”中关闭它。
入侵者照片
应用不会播放快门声,但在某些国家销售的手机(例如日本和韩国)总会播放快门声。如果其他应用正在使用相机,或手机没有前置摄像头,就不会拍照。在您解锁自己创建的第一个保险箱之前,这些照片会用 Android Keystore 密钥封存。
照片详细信息
- 对于 HEIC、PNG 和 WebP 照片,隐藏的详细信息(EXIF)会保留在文件内部。整个文件仍然是加密的。
- 在 Android 10 及更高版本上,由于应用不请求位置权限,Android 会从 LifeVeil 读取的照片中移除 GPS 位置信息。原件从图库删除后,该位置信息也随之消失。
- 通过 Android 照片选择器添加的照片会获得基于日期的新名称,因为选择器不提供原始名称。
系统界面打开期间暂停锁定
当系统界面打开时(权限请求、删除确认、照片或文件选择器、指纹提示),以及导入或导出正在进行时,应用会暂不锁定。如果您已离开应用,它会在这些操作结束 2 秒后锁定。
所有保险箱共用一个设备盐值
一部手机上的所有保险箱都使用同一个设备盐值。如果有人拿到了这个盐值,一次猜测就能同时测试所有保险箱。攻击单个保险箱的成本不变。
任何应用都无法阻止的情况
有人看着您绘制图案,或有摄像头拍下您的屏幕。
两者都丢失时,任何人都帮不了您
如果您同时丢失了图案和恢复短语,任何人都无法找回您的文件,包括我们。