Skip to main content

Module devicekey

Module devicekey 

Source
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。