如果创建了新的LUKS设备,则可以指定选项-hash和-iter-time。
例如:
sudo cryptsetup luksFormat --cipher aes-cbc-essiv:sha256 --key-size 256 --iter-time 2100 --hash sha512 /dev/loop0在密码设置的手册中:
-哈希,用于创建操作的-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指的是用于加密分区而不是密钥的实际算法)。这对我来说意味着这对我的理解也是错误的。
那么,这一切到底是如何工作的,以及上面描述的散列的作用是什么呢?如果有人能澄清我以上的误解(也许有一些参考),那就太好了。
发布于 2013-11-16 10:37:44
LUKS格式有多个密钥槽,每个密钥插槽都可能包含用于数据加密的加密主密钥。此主密钥使用从您的密码中派生的另一个密钥进行加密。
使用普通hash_function(passphrase)生成密钥将是哑的,因为哈希(如sha1 )可以快速计算(SHA-1是MAC算法的一个示例,用于消息的身份验证,而不是用于密码)。
对于基于密码的数据加密,您希望该函数能够缓慢地阻止暴力攻击。为此目的,使用了PBKDF2 (基于密码的密钥派生函数)(有关动机和其他示例,请参见这个Sec.SE问题上的优秀答案)。
derivedKey = PBKDF2(hash_function, passphrase, salt, iterations, derivedKeyLen)我安装的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导出的密钥长度取决于用于数据加密的密码。迭代次数取决于处理器速度。
这些细节可以在密码设置的手册页面中找到(pbkdf2应该会引起注意)。有关其他安全细节,请参见密码设置常见问题。
发布于 2013-11-18 00:12:18
您说得对,存储用于加密的凭据和存储用于身份验证的凭据是两个不同的问题。
当用户登录时,操作系统需要有其密码的引用副本,以便与用户输入的密码进行比较。如果输入的密码与引用密码相同,则身份验证成功。为了使密码恢复变得困难,系统不存储密码,而是存储密码的哈希 (一个缓慢的、咸化的散列使蛮力试图猜测密码更加困难)。
加密的工作原理不同。其目的是防止攻击者访问该存储空间,因此不能仅从设备上存储的内容中提取加密密钥。因此,密钥不是存储在设备上,而是由存储在设备上的信息与用户提供的信息相结合来构造的。通常,密钥是由存储在设备上的盐与用户提供的密码相结合生成的。同样,为了减缓蛮力的尝试,合并这些值的进程必须是缓慢的,并且进程除了用户的密码外,还使用每个设备的值( salt),这样使用相同的密码就不会导致相同的密钥。
实际上,密码学上来说,一个缓慢的密码哈希和一个缓慢的密钥派生函数是相同的问题,称为键拉伸。LUKS使用的是PBKDF2,这是事实上的标准密钥扩展功能之一(尽管密码破解方面的技术进步使bcrypt或scrypt更可取)。现代unix系统对密码散列使用了类似的机制(“MD5”或“sha-512”实际上是迭代的,在构造上类似于PBKDF2)。
如果用户提供了错误的密码,则数据的解密将返回垃圾。
与大多数其他加密机制一样,LUKS不使用从密码派生的密钥作为数据的加密密钥。相反,数据加密密钥是在设备创建时随机生成的,而不是直接存储的。LUKS存储用每个密码派生密钥加密的该密钥的副本。在LUKS术语中,每个密码派生的密钥占据卷头中的一个槽;每个槽对应一个密码。您可以阅读TKS1 1纸获得两层加密方案的详细信息。
https://unix.stackexchange.com/questions/101398
复制相似问题