为什么 LUKS 需要生成哈希值?

stu*_*ent 5 dm-crypt luks

如果创建新的 LUKS 设备,则可以指定选项-hash-iter-time.

例如像这样:

 sudo cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 --iter-time 2100 --hash sha512 /dev/loop0
Run Code Online (Sandbox Code Playgroud)

从 cryptsetup 的联机帮助页:

--hash, -h

对于创建操作指定用于密码散列的散列。

对于 luksFormat 操作,指定 LUKS 密钥设置方案和卷密钥摘要中使用的哈希。

由于第一句话,我天真地假设散列的使用方式与标准 linux 系统中的使用方式类似,其中散列值由指定的算法(例如sha512)创建。为了让拥有哈希值并想要尝试字典攻击的攻击者更难,对 has 进行了加盐,并且算法迭代了 n 次以延长计算时间。在这种情况下, has 值存储在/etc/shadow. 如果用户登录,则会计算哈希值并将其与/etc/shadows文件中的值进行比较。如果它们相等,则接受用户登录。以类似的方式,拥有文件的攻击者/etc/shadow(从那里他也知道盐值)可以从字典中的单词计算哈希值,并将其与/etc/shadow文件中的值进行比较,直到某些字符串匹配为止。

如果 LUKS 中的散列以类似的方式使用,我认为它必须存储在某个地方(例如在分区头中),并且如果攻击者由于某些原因可以访问分区头(或存储它的文件),他可以以与上述类似的方式继续找出密码。这让我想到了如何获取哈希的问题:如何提取 LUKS 设备的哈希值?

想想 LUKS 系统可能是如何工作的,我猜它不是这样使用的。相反,我认为,密码仅用于加密密钥(并且没有散列存储在任何地方),它以加密方式存储在标头中。但是在 LUKS 手册页中,我没有找到任何提示,即密钥加密使用哪种加密算法以及如何更改它。(选项--cipher aes-cbc-essiv:sha256 --key-size 256是指用于加密分区而不是密钥的实际算法)。这对我来说表明这种理解我也是不正确的。

那么,这一切是如何真正起作用的,上面描述的哈希的作用是什么?如果有人能澄清我上面的误解(也许有一些参考资料),那就太好了。

Lek*_*eyn 5

LUKS 格式有多个密钥槽,每个槽可能包含用于数据加密的加密主密钥。此主密钥使用从您的密码派生的另一个密钥进行加密。

使用普通hash_function(passphrase)来生成密钥会很愚蠢,因为可以快速计算诸如 sha1 之类的哈希(SHA-1 是MAC算法的一个示例,用于消息验证,而不是用作密码的普通)。

对于基于密码短语的数据加密,您希望该功能运行缓慢以阻止暴力攻击。为此,使用了 PBKDF2(基于密码的密钥派生函数)(有关动机和其他示例,请参阅此 Sec.SE 问题的优秀答案)。

derivedKey = PBKDF2(hash_function, passphrase, salt, iterations, derivedKeyLen)
Run Code Online (Sandbox Code Playgroud)

我安装的 hash_function 是 sha1,如下所示cryptsetup --help

Default compiled-in key and passphrase parameters:
        Maximum keyfile size: 8192kB, Maximum interactive passphrase length 512 (characters)
Default PBKDF2 iteration time for LUKS: 1000 (ms)

Default compiled-in device cipher parameters:
        loop-AES: aes, Key 256 bits
        plain: aes-cbc-essiv:sha256, Key: 256 bits, Password hashing: ripemd160
        LUKS1: aes-xts-plain64, Key: 256 bits, LUKS header hashing: sha1, RNG: /dev/urandom
Run Code Online (Sandbox Code Playgroud)

导出的密钥长度取决于用于数据加密的密码。迭代次数取决于您的处理器速度。

这些详细信息可以在 cryptsetup 的手册页中找到(pbkdf2 应该会响起)。有关其他安全详细信息,请参阅cryptsetup常见问题解答