如何确定可以在 dm-crypt/LUKS 中使用哪些密码和密码模式?

如何确定可以在 dm-crypt/LUKS 中使用哪些密码和密码模式?

我正在使用基于 Ubuntu 的系统,并且很难确定我可以使用哪些密码和密码模式。

cryptsetup 手册页说:

“查看 /proc/crypto 以获取可用选项列表。您可能需要加载其他内核加密模块才能获得更多选项。”

我的 /proc/crypto 中的内容很少。如何找出哪些额外的内核加密模块可供我加载?

答案1

有很多文档和手册页需要阅读,但您可能特别感兴趣的一个文档是LUKS 磁盘格式规范(PDF)。

附录 B(自然是接近末尾)写道,

密码和哈希规范注册表

即使密码名称密碼模式字符串不会被任何 LUKS 操作解释,它们必须对所有实现具有相同的含义,以实现基于 LUKS 的不同实现之间的兼容性。LUKS 必须确保底层密码系统可以使用密码名称和密码模式字符串,并且由于这些字符串可能并不总是密码系统的原生字符串,因此 LUKS 可能需要将它们映射到适当的内容中。

有效的密码名称列于表 1 中。

表 2 列出了有效的密码模式。根据约定,使用 IV 和调整的密码模式必须从全零 IV/调整开始。这适用于对加密/解密原语的所有调用,尤其是在处理密钥材料时。此外,这些 IV/调整密码模式通常通过在扇区边界重新植入调整/IV 将密码流切割成独立的块。第一个加密/解密块的全零 IV/调整要求等同于将第一个块定义为位于扇区 0 的要求。

表 3 列出了有效的哈希规范哈希规范字段。兼容的实现不必支持所有密码、密码模式或哈希规范。

表 1:有效的密码名称

  • aes - 高级加密标准 - FIPS PUB 197
  • twofish - Twofish:128 位分组密码 - http://www.schneier.com/paper-twofish-paper.html    (见下文)
  • 蛇 - http://www.cl.cam.ac.uk/~rja14/serpent.html
  • cast5——RFC 2144
  • cast6——RFC 2612

表 2:有效密码模式

  • ecb - 直接使用密码输出
  • cbc-plain - 密码以 CBC 模式运行。CBC 链在每个扇区被切断,并使用扇区号作为初始向量重新初始化(转换为 32 位和小端)。此模式在 [Fru05b] 第 4 章中指定。
  • cbc-essiv:哈希- 密码在 ESSIV 模式下运行,使用哈希用于生成原始密钥的 IV 密钥。例如,当使用 sha256 作为哈希时,密码模式规范为“cbcessiv:sha256”。ESSIV 在 [Fru05b] 第 4 章中指定。
  • xts-plain64-http://grouper.ieee.org/groups/1619/email/pdf00086.pdf,plain64是普通初始向量的 64 位版本

表 3:有效的哈希规范

  • sha1 - RFC 3174 - 美国安全哈希算法 1 (SHA1)
  • sha256 - 符合 FIPS 180-2 的 SHA 变体
  • sha512 - 符合 FIPS 180-2 的 SHA 变体
  • ripemd160-http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html   (见下文)

编者注:以上内容摘自规范。撰写后,这些文档的 URL 已发生更改:

答案2

在我撰写本文时,内核 5.1 的版本有两种不同的密码字符串格式,即“旧”格式和“新”格式。到目前为止,这个问题中的所有内容,以及显然所有文档,都涉及“旧”格式,因此我将在此进行描述。这仅适用于加密。如果使用 dm-crypt 的完整性,则必须考虑 AEAD 密码,这会变得更加复杂。

内核解析的格式是“密碼[:键数]-模式-iv模式[:伊沃普茨]“。 例子:aes-xts-plain64blowfish-cbc-essiv:sha256aes:64-cbc-lmk

  • 密碼 要使用的密码,例如aes,,,,等。内核anubisdm -crypt 驱动程序没有密码列表。这会传递给 Linux Crypto API,因此可以使用内核支持的任何合适密码twofisharc4

  • 键数 可选的用于密码的密钥的幂数。除 ivmode 外,其他所有模式的默认值均为 1 lmk,ivmode 的默认值为 64。这实际上仅适用于 LMK,1 以外的值将无法在其他模式下正常工作。

  • 模式与密码一起使用的块链接模式。示例为ecb、、cbcxts除了知道ecb不使用 IV 之外,md-crypt 驱动程序还会将其传递给 Linux Crypto API,并且可以使用内核支持的任何链接模式。

  • iv模式用于生成每个扇区的初始化向量 (IV) 的算法。在典型的对称密钥加密中,与 dm-crypt 不同,IV 是加密或解密时与密钥一起传递到密码中的另一位数据。整个操作只传递一个 IV。由于 dm-crypt 需要能够单独读取和写入每个扇区,因此它不会将整个磁盘加密为单个操作。相反,每个扇区都有一个 IV。这里指定了创建 IV 的算法,而不是将 IV 作为数据传递。这不是 Linux Crypto API 的一部分,因为 IV 生成不是由密码完成的,并且允许iv模式值由 dm-crypt 驱动程序定义。它们是:

    • plain, plain64, plain64be,benbi 这些只是使用各种格式的扇区号作为 IV。适用于 XTS 等块模式,旨在使用简单且可预测的 IV 来抵御水印等攻击。 plain64似乎是最常推荐的。
    • nullIV 始终为零。出于测试和向后兼容性考虑,您不应使用此选项。
    • lmk与Loop-AES加密方案兼容。
    • tcw与 TrueCrypt 兼容。
    • essiv使用通过密钥哈希加密的扇区号。适用于使用简单 IV(如)时无法抵御各种攻击的模式(如 CBC)plain64
  • 伊沃普茨要使用的哈希essiv iv模式,其他所有模式均忽略。

作为特例,“密碼-plain“ 要不就 ”密碼“被解释为”密碼-cbc-plain“。另一个特殊情况是ecb模式没有iv模式指定。

这与/proc/crypto

对于/proc/crypto,只有密碼模式是相关的。dm-crypt 构建了一个 Crypto API 规范,形式为“模式(密碼)“并从内核请求它。这是在 中应该寻找的内容。/proc/crypto例如:nameskcipher

name         : xts(aes)
driver       : xts-aes-aesni
module       : kernel
priority     : 401
refcnt       : 1
selftest     : passed
internal     : no
type         : skcipher
async        : yes
blocksize    : 16
min keysize  : 32
max keysize  : 64
ivsize       : 16
chunksize    : 16
walksize     : 16

表示这是一个对称密钥密码、dm-crypt 使用的密钥以及在使用 dm-crypt 指定时写入的名称。这些字段type还告诉我们此密码可以使用哪些密钥大小。skcipherxts(aes)aes-xtskeysize

如果这是来自模块,模块名称可能会显示在行中module。但是,许多密码(通常是那些没有任何硬件特定代码的软件中的密码)都是作为通用密码实现的,该密码与通用块链接代码相结合以生成最终的 skcipher。例如:

name         : xts(anubis)
driver       : xts(ecb(anubis-generic))
module       : kernel
type         : skcipher

name         : anubis
driver       : anubis-generic
module       : anubis
type         : cipher

在这种情况下,anubis 密码与内核 XTS 块链接模式代码相结合,生成最终密码xts(anbuis),该密码已分配模块kernel。但为了使其可用,我们需要来自anubis模块的通用 anubis 密码。大多数密码都有一个模块别名“crypto-密碼“可用于加载它们,例如modprobe crypto-anubis加载提供阿努比斯密码的模块。

使用cryptsetup benchmark命令时,只有密碼模式很重要,因为这就是基准测试的全部内容。如果模式未指定则默认为 CBC。iv模式完全被忽略。因此,对于基准测试,aesaes-cbcaes-cbc-foobar都是等价的。

答案3

您可以使用以下命令列出内核支持的密码,

[root@arif]# ls /lib/modules/[your kernel version]/kernel/crypto/
algif_rng.ko.xz   blowfish_common.ko.xz   cmac.ko.xz               cts.ko.xz          gf128mul.ko.xz           michael_mic.ko.xz  rsa_generic.ko.xz      tgr192.ko.xz           xts.ko.xz
ansi_cprng.ko.xz  blowfish_generic.ko.xz  crc32_generic.ko.xz      deflate.ko.xz      ghash-generic.ko.xz      pcbc.ko.xz         salsa20_generic.ko.xz  twofish_common.ko.xz   zlib.ko.xz
anubis.ko.xz      camellia_generic.ko.xz  crct10dif_common.ko.xz   des_generic.ko.xz  jitterentropy_rng.ko.xz  pcrypt.ko.xz       seed.ko.xz             twofish_generic.ko.xz
arc4.ko.xz        cast5_generic.ko.xz     crct10dif_generic.ko.xz  dh_generic.ko.xz   khazad.ko.xz             rmd128.ko.xz       serpent_generic.ko.xz  vmac.ko.xz
async_tx          cast6_generic.ko.xz     cryptd.ko.xz             drbg.ko.xz         lrw.ko.xz                rmd160.ko.xz       sha512_generic.ko.xz   wp512.ko.xz
authencesn.ko.xz  cast_common.ko.xz       crypto_null.ko.xz        fcrypt.ko.xz       mcryptd.ko.xz            rmd256.ko.xz       tcrypt.ko.xz           xcbc.ko.xz
authenc.ko.xz     ccm.ko.xz               crypto_user.ko.xz        gcm.ko.xz          md4.ko.xz                rmd320.ko.xz       tea.ko.xz              xor.ko.xz

luks您可以使用以下命令列出可以使用的密码和哈希以及它们的 I/O 比较,

[root@arif arif]# cryptsetup benchmark
# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1       289342 iterations per second for 256-bit key
PBKDF2-sha256     353293 iterations per second for 256-bit key
PBKDF2-sha512     227555 iterations per second for 256-bit key
PBKDF2-ripemd160  233224 iterations per second for 256-bit key
PBKDF2-whirlpool  236165 iterations per second for 256-bit key
argon2i       4 iterations, 917485 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
argon2id      4 iterations, 951672 memory, 4 parallel threads (CPUs) for 256-bit key (requested 2000 ms time)
#     Algorithm |       Key |      Encryption |      Decryption
        aes-cbc        128b       642.2 MiB/s      2495.8 MiB/s
    serpent-cbc        128b        89.3 MiB/s       542.6 MiB/s
    twofish-cbc        128b       100.4 MiB/s       343.1 MiB/s
        aes-cbc        256b       477.2 MiB/s      1979.2 MiB/s
    serpent-cbc        256b        89.3 MiB/s       538.9 MiB/s
    twofish-cbc        256b       173.3 MiB/s       343.1 MiB/s
        aes-xts        256b      1668.0 MiB/s      1664.1 MiB/s
    serpent-xts        256b       535.7 MiB/s       523.4 MiB/s
    twofish-xts        256b       332.6 MiB/s       339.8 MiB/s
        aes-xts        512b      1384.5 MiB/s      1380.7 MiB/s
    serpent-xts        512b       539.3 MiB/s       524.4 MiB/s
    twofish-xts        512b       335.0 MiB/s       340.1 MiB/s

您可以通过以下命令比较特定的密码,

[root@arif]# ciphers="aes-xts serpent-xts anubis-xts"

[root@arif]# echo "#     Algorithm |       Key |      Encryption |      Decryption";for i in $ciphers ; do cryptsetup benchmark --cipher $i|tail -n 1; done

#     Algorithm |       Key |      Encryption |      Decryption
        aes-xts        256b      1613.9 MiB/s      1642.8 MiB/s
    serpent-xts        256b       538.9 MiB/s       521.9 MiB/s
     anubis-xts        256b       182.0 MiB/s       182.1 MiB/s

相关内容