Expand description
设备密钥:把一把随机 KEK 交给这台机器的 OS 密钥库保管。
§它是什么
一个普通的 slot,和密码槽、恢复码槽并列。区别只在这把 KEK 从哪来:
| 槽位 | KEK 的来源 |
|---|---|
| 密码 | Argon2 从密码派生 |
| 恢复码 | HKDF 从 26 个词的熵派生 |
| 设备密钥 | 随机生成,密文交给 OS 密钥库保管 |
前两者可以随时重新算出来(记得密码/拿着纸条就行),设备密钥不能—— 它只存在于那台机器的 OS 密钥库里。这个差别决定了它的全部性质。
§为什么绑 vault_salt
vault_salt 在同一个 vault 内是相同的(见 crate::header::FixedHeader),
所以拿它当保管 id 意味着「一个库共用一把设备密钥」:
- 给库里任一文件挂上设备密钥,同库其它文件也能用同一把开
- 换个库自动隔离,不会互相解开
换成绑文件路径就不成立了:文件改名、移动之后 id 就变了,密钥还在 OS 密钥库里但再也对不上——表现为「明明开过一次,第二天打不开了」。
§它绝不能是唯一凭据
换机器、重装系统或重置系统生物识别——任一发生,这个槽就永久 解不开。所以挂设备密钥时必须已经有一个密码槽,删密码槽时也必须 拦住「只剩设备密钥」的状态。
这一条不是提醒,是需要代码强制的:用户很容易觉得「有指纹就够了」, 而代价要到换电脑那天才显现,那时数据已经拿不回来了。
§它不比密码更安全
设备密钥保管后端挡得住硬盘被偷和换机器解密,挡不住正在这台机器上 以你的身份运行的恶意程序——它可以在你按下指纹之后的窗口里发起解封。 所以设备密钥的定位是省去每次输密码,不是「更安全」。
界面上必须这么说。反过来说会让用户因为开了它而把密码设得更弱, 那是净损失。
Constants§
- SECRET_
LEN - OS 密钥库保管的那把密钥的长度。
Functions§
- kek_
from_ secret - 把 OS 密钥库保管的密钥派生成 KEK。
- slot_id
- 一个 vault 的设备密钥在 OS 密钥库里的保管 id。