当您luksDump
在 LUKS 设备上运行时,我得到以下信息:
$ sudo cryptsetup luksDump /dev/sda1
LUKS header information
Version: 2
Epoch: 3
Metadata area: 16384 [bytes]
Keyslots area: 16744448 [bytes]
UUID: 4640c6e4-[…]
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
[…]
我非常清楚“版本”指的是什么(当前最好的是 v2,所以这就是您应该瞄准的目标)并且我已经看到了Epoch
从 3 到 5 的值。
然而,它Epoch
实际上指的是什么呢?我应该以什么价值为目标?那里写的数字(安全方面)重要吗?例如,如果它仍然是 Epoch 3,那会很糟糕吗?可以升级那个纪元吗?
我在网上搜索过常见问题解答供参考,但epoch
那里没有提到这个词。
答案1
每次您更改 LUKS 标头中的任何内容(例如添加或删除密钥等时),纪元都会增加。
这LUKS2 接头规范状态:
uint64_t seqid; // sequence ID, increased on update
seqid
是一个计数器(序号),当写入新的标头更新时,该计数器始终会增加。标头较高塞吉德 较新,用于恢复(如果存在具有不同 seqid 的主标头和辅助标头,则自动使用较新的标头)。
为什么这在代码和技术文档中被称为“序列 ID”,但在向最终用户显示时使用术语“Epoch”,仍然是个谜。
这实际上是同一件事,如果你阅读精美的来源,它将 seqid 打印为 Epoch:
log_std(cd, "Epoch: \t%" PRIu64 "\n", hdr->seqid);
太长了;博士您可以安全地忽略 Epoch,它是一个无害的计数器,没有特定含义。
答案2
我不同意 - 回复:太长了;博士您可以安全地忽略 Epoch,它是一个无害的计数器,没有特定含义。
它确实有特定的含义:
在计算中,纪元是计算机测量系统时间的日期和时间。大多数计算机系统将时间确定为表示从特定任意日期和时间中删除的秒数的数字。例如,Unix 和 POSIX 将时间测量为自 1970 年 1 月 1 日 00:00:00 UT(称为 Unix 纪元)以来经过的秒数。 Windows NT 及更高版本上的 NT 时间纪元是指从 1601 年 1 月 1 日 0h 起以 (10^-7)s 为间隔的 Windows NT 系统时间
根据 LUKS 的源代码(lib/bitlk/bitlk.c)包含以下常量:
#define EPOCH_AS_FILETIME 116444736000000000
使用日期转换器,例如:Epoch 和 Unix 时间戳转换工具,产生该常量为以下日期和时间:
转换器输出
假设该时间戳以纳秒(十亿分之一秒)为单位: 格林威治标准时间: 1973 年 9 月 9 日星期日下午 5:45:36 您的时区: 1973 年 9 月 9 日星期日中午 12:45:36 GMT-05:00 DST 相对的: 48 年前
该常量是上述日期的数值表示(以纳秒为单位)。纪元几乎总是用于比较测试,将数据集、文件、列和其他用一个日期标记的各种项目与纪元进行比较,即:
// Pseudo-code
long (DataSet 1.Date - Epoch) = X,
long (DataSet 2.Date - Epoch) = Y
// Comparison
If X = Y then
// Perform items for valid data sets
Else If X != Y then
// Attempt to repair data sets
Else
// Perform Error Trapping
End
在 LUKS 情况下,在更改或更新后,每当加密集的 2 个按位副本匹配时,Epoch 计数器就会增加 1。看关于LUKS头信息的问题。我无法告诉你为什么选择这个特定的时代,只是为了好玩:1973 年 9 月 9 日发生了什么