由于内存限制,我无法在 Raspberry PI 上打开我的一个 LUKS 分区。我已经发现在这种情况下的建议是在最慢的设备上重新创建分区,该设备将访问它(在本例中为 Raspberry PI)。
不过,我担心安全级别可能会下降(可能计算能力较弱,就会使用较弱的密钥)。
以下是 cryptsetup 文档中关于此问题的说明:
注意:密码迭代由 cryptsetup 根据 CPU 功率确定。在较慢的设备上,这可能低于您的预期。我最近在 Raspberry Pi 上对此进行了基准测试,结果约为典型 PC 迭代次数的 1/15。如果安全性至关重要,您可能希望增加迭代所花费的时间,但代价是以后解锁速度较慢。对于 Raspberry Pi,使用
cryptsetup luksFormat -i 15000 <target device>
为您提供与普通 PC 相同的密码短语迭代和主密钥迭代的迭代次数和安全级别。如果有疑问,请使用
cryptsetup luksDump <target device>
并通过使用不同的迭代时间(“-i”后的数字是以毫秒为单位的迭代时间)再次创建容器来相应地调整迭代次数,直到满足您的要求。
现在,我不确定如果我遵循上述建议会发生什么?
- 分区是否像 PC 一样安全(如果迭代次数正确),只是慢了点?
- 如果速度较慢,那么只有解锁速度较慢,还是以后的读写速度与没有额外迭代一样快?(如果是这样,为什么?是因为通过解锁我们只解密了稍后将用于解密分区中的内容的密钥吗?)
- 它是否仍会比在快速 PC 上创建的分区消耗更少的内存?(换句话说:我想重新创建分区以便能够将其与 Raspberry PI 一起使用。使用默认值它将可用,但安全性较低。增加迭代次数后它是否仍可用,还是会再次消耗过多内存?)
答案1
首先请注意,您正在阅读的 LUKS 文档是为 LUKS1 编写的,现在已经有些过时了。您引用的所有内容(例如迭代计数)都是针对 PBKDF2 算法的,您的分区实际上并未使用。
LUKS2 支持两种将密码转换为密钥的算法:传统的 PBKDF2 以及较新的 Argon2。后者是 LUKS 现在默认使用的算法,并且它是唯一具有(可调整的)最低所需内存量的算法。这与“迭代次数”不同。
不过,我担心安全级别可能会下降(可能计算能力较弱,就会使用较弱的密钥)。
你不是在调整按键强度,而是在调整按键的保护。
您正在调整的参数是为了防止有人试图攻击您输入的密码 - 它们通过使密钥派生过程变得异常缓慢来防止暴力攻击(即连续尝试各种密码)。
但是,生成的密钥本身总是同样强大(与任何其他 AES 密钥一样好),没有人会费心直接攻击它。
如果速度较慢,那么只有解锁速度较慢,还是以后的读写速度与没有额外迭代一样快?(如果是这样,为什么?是因为通过解锁我们只解密了稍后将用于解密分区中的内容的密钥吗?)
每次您解锁卷时,LUKS 都会使用“密钥派生函数”(KDF)将您的密码转换为加密密钥,以便该过程更能抵抗暴力攻击 - LUKS1 始终使用“PBKDF2”,它通过计算速度慢来抵抗攻击(但不施加任何内存要求),而 LUKS2 还支持“Argon2”,而这需要一定数量的 RAM。
密钥派生仅在解锁时发生一次;其余部分(实际数据加密)根本不需要涉及密码。
(换句话说:我想重新创建分区以便能够将其与 Raspberry PI 一起使用。使用默认值可以使用,但安全性较低。增加迭代次数后它是否仍然可用,还是会再次消耗太多内存?)
你根本不需要重新创建分区,因为即使是密码派生的密钥也不会直接用于加密你的数据:它只加密掌握存储在 LUKS 卷头中的密钥。
这就是为什么可以快速更改密码而无需重新加密整个磁盘(甚至不需要多个密码)的原因,同样,LUKS 允许您同样轻松地更改 KDF 参数。
如果默认的 Argon2 参数使用了太多内存,只需告诉 LUKS:
cryptsetup luksConvertKey --pbkdf "argon2i" --pbkdf-memory <num_kilobytes> <device>
如果您根本不能使用 Argon2,您仍然可以告诉 LUKS 改用 PBKDF2:
cryptsetup luksConvertKey --pbkdf "pbkdf2" --iter-time <milliseconds> <device>
您可以直接指定 PBKDF2 的数量,而不是毫秒(与设备相关)迭代次数您想要的(无论您在什么设备上执行此操作,总会得到相同的结果)– PC 上的默认值约为一百万:
cryptsetup luksConvertKey --pbkdf "pbkdf2" --pbkdf-force-iterations <count> <target>
luksChangeKey
(更改密码时)接受相同的选项,事实上,它们似乎需要每次更改密码时都要指定。