数据还在,钥匙却死了:关于环境派生密钥 EDK
假设有一台服务器,上面存储着一批经过加密的数据。它长期运行,定期向外部系统发送心跳,表明自己仍然处于正常维护状态。
某一天,服务器不再应答。
系统不会立刻采取行动,而是先进入宽限状态。在规定时间内,如果维护者重新出现,或者服务器恢复正常,便可以取消后续操作。反之,如果宽限期结束以后仍然没有任何有效应答,系统将按照预先设定的规则销毁服务器上的关键解密私钥。数据没有被删除,硬盘也没有被格式化。原有的密文依然完整地保存在存储介质中,但服务器已经失去了自行解密它们的能力。
当然,这并不意味着数据就此无法恢复。只要存在一份有效的私钥备份,仍然可以重新建立访问。
于是我设想,将最后一份备用私钥保存在一枚离线的硬件加密 U 盘中,例如 Kingston IronKey Keypad 200。这枚设备需要输入 PIN 才能解锁。只要正确输入密码,就可以取回备用私钥,使已经失去解密能力的服务器重新恢复运行。
那么,问题就转移到了这个 PIN 上。如果它被记录在纸上、保存在密码管理器中,或者始终由某个人记忆,那么这套机制最终仍然依赖一份长期存在的固定密码。
我想尝试另一种方式。
让这个 PIN 不再是一份被直接保存的秘密,而是由持续受到维护的现实环境决定。
这便是我开始研究 Environment-Derived Key(EDK,环境派生密钥)的原因。
一、让现实环境参与密钥派生
EDK 的基本思想,是将数字秘密的恢复条件与现实环境联系起来。在通常的密码系统中,秘密的有效性主要取决于密钥本身是否得到妥善保存。只要密钥仍然存在,就可以在将来的某个时间重新使用。
但现实环境并不是静止的。
物品的位置可能改变,材料可能老化,电子元件可能失去供电,原本能够被准确读取的物理状态,也可能因为长期无人维护而逐渐变得无法辨认。我设想选择一组现实环境中的物理状态,按照事先确定的规则进行读取,将其编码成数字信息,并让这些信息参与最终 PIN 的派生。维护者可以通过日常检查和必要的修复,保持原始状态的可恢复性。当维护停止,物理环境又经历足够长时间的变化以后,原有信息可能逐渐流失。
需要注意的是,环境发生变化并不等于信息必然消失。
例如,一个物品虽然被移动过,但原来的位置可能仍然留有痕迹。一个电子元件虽然失去了供电,其中的数据也未必立即无法通过技术手段恢复。
因此,EDK 真正需要研究的,并不是环境会不会变化,而是这种变化是否会让有关原始状态的信息实际减少。
二、环境与电子节点共同参与
除了现实环境,我还为 EDK 设计了另一组电子秘密来源。
目前的方案采用六个易失性电子节点,每个节点分别保存一份随机秘密的 Shamir 份额。系统采用 3-of-6 门限机制,即六个节点中任意三个有效且兼容的份额,就能够重建原始电子秘密。
如此一来,即使个别电子节点发生故障,也不一定会让整个系统立即失效。电子节点可以被分别放置在不同的物理位置,承受不同的供电和环境条件。部分节点可能被长期供电,另一些则依赖自身的备用电源维持状态。
但六个节点并不是六把能够独立打开保险柜的钥匙。它们共同承担的是电子秘密的保存和恢复。
真正计算 PIN 时,EDK 还要求提供现实环境的观测结果。
在当前的 1.0 参考实现中,系统先根据预定义的 Manifest 对环境观测进行精确编码,再使用 Shamir 算法恢复电子秘密,最后结合公开盐值及设备上下文,通过 HKDF-SHA256 生成一个 12 位数字 PIN。
这个 PIN 就是我设想中用于解锁 IronKey 的凭据。
环境观测和电子秘密是两种不同的输入。只保留电子节点,而不提供原有环境信息,并不能通过正常参考流程重新计算出相同的 PIN。不过,这并不自动证明现实环境具有足够的秘密性。具体的安全贡献,仍然取决于环境状态对于攻击者究竟有多大程度的不可预测性。
三、联动死手机制
将 EDK 与服务器恢复机制结合以后,整个设计就具有了另一层含义。
服务器在正常状态下持续运行,并定期完成心跳应答。当应答中断时,系统进入宽限阶段,而不是立即删除任何密钥。只有满足预先规定的终止条件以后,才会触发在线私钥销毁。此时,系统在设计上只剩下最后一条恢复路径:通过 IronKey 取回离线备用私钥。
而 IronKey 的解锁 PIN,又需要由 EDK 重新派生。如果维护者及时回来,并且原有环境状态与足够的电子份额仍然可以恢复,那么系统仍然有机会重新获得备用私钥。如果维护长期停止,环境中的原始信息逐渐消失,电子节点也持续失效,那么这条最终恢复路径可能随之丧失。
我希望研究的正是这样的过程。
它并不是简单地在倒计时结束以后删除所有数据,而是让数据继续存在,让离线私钥继续存在,同时让获取这份私钥所需的条件依赖于现实世界的持续维护。这与一般的定时删除程序不同。定时删除是软件主动改变存储状态,而 EDK 希望利用物理信息的自然变化,使恢复能力在停止维护以后逐渐衰减。
两者结合,才构成我所设想的联动死手机制。
四、为什么不直接设置永久备份
从可靠性工程的角度来看,上述设计存在一些刻意保留的脆弱性。
传统密钥管理往往强调多重备份、灾难恢复和长期可用性。我这里却有意限制永久恢复通道的存在。如果将 IronKey 的 PIN 同时写在一张纸上,或者保存到另一台始终能够访问的设备中,那么现实环境发生怎样的变化,都不会真正影响最终恢复能力。
同样,如果服务器私钥还存在于其他备份、快照或历史副本中,那么服务器按照规则删除当前私钥,也未必能够达到预期效果。
但这并不意味着 EDK 能够保证秘密必然消失。如果有人在此之前就已经复制了足够的电子份额、完整的环境观测或者最终 PIN,那么后续环境的衰减无法撤销已经形成的历史副本。
EDK 也无法仅凭物理状态发生变化,就证明原有信息已经彻底不可恢复。
因此,我更愿意将它定义为一种维护依赖型恢复机制,而不是绝对的数据销毁技术。
它所探索的,是在特定威胁模型和物理条件下,能否让数字秘密的恢复能力随维护活动停止而衰减。
五、EDK 1.0 的进展
目前,我已经将 EDK 的概念算法及其参考实现开源至 GitHub。
1.0 版本使用 Python 实现,包含环境观测编码、Shamir 门限秘密共享、HKDF-SHA256 派生、12 位 PIN 映射、电子节点份额修复,以及相关的异常处理与测试工具。
与此同时,项目还包含环境采样、生命周期模拟、数学模型,以及面向 Linux 和 Raspberry Pi 的实验性电子节点读写程序。候选电子元件为 MCP7940N,计划利用其电池备份 SRAM 保存电子秘密份额。
不过,当前版本完成的是软件层面的概念验证,并没有完成真实环境的长期测量,也没有证明电子节点在各种供电和物理条件下能够表现出预期的生命周期特征。更重要的是,目前环境观测采用精确匹配机制。如果环境读取发生变化,程序可能计算出一个不同的 PIN,而不是自动纠正到原来的结果。
对于具有错误次数限制的硬件加密设备,这种差异不能被忽略。未来还需要研究环境状态的可重复读取、条件最小熵、容错恢复、物理数据残留、电子份额认证,以及真实硬件之间的联动问题。
服务器心跳、宽限期和自动销毁机制则属于更上层的系统架构,目前尚不能将其视为 EDK 1.0 已经完成并验证的功能。
六、最后
我不认为这样的机制适合所有数据。
对于普通文件、照片或者需要长期保存的资料,可靠的备份与灾难恢复机制显然更为重要。把恢复能力主动绑定到一组可能失效的现实条件上,反而可能制造不必要的风险。
但我仍然认为,这个问题值得研究。数字系统通常试图通过冗余和复制对抗时间,而 EDK 尝试引入另一个变量:持续维护。
如果一个系统的维护者长期不再出现,系统是否应该永远保留原有的恢复能力?又能否让某种恢复能力真正依赖于现实世界中持续发生的维护活动?
我并没有为这些问题找到完整答案。EDK 1.0 只是将其中一部分构想转化为可以运行、测试和讨论的参考程序。那些关于物理环境、信息衰减和最终恢复能力的核心假设,仍然有待实际验证。
我希望最终实现的并不是让数据在某个时刻突然消失。
而是让一份秘密的存续,不再完全独立于现实世界。
数据可以依然存在,但维持其可恢复性的条件,未必能够永远存在。

















这一切,似未曾拥有