Tentando entender a criptografia do LUKS

8

Eu decidi criptografar minha partição raiz com LUKS + LVM.

Minha configuração do ThinkPad:

  • SSD de 128 GB Samsung 830
  • HDD de 750 GB
  • Core 2 Duo 2,5 GHz P9500
  • 8 GB de RAM

Mas quanto mais eu leio, menos eu entendo sobre esses dois assuntos:

1a. A cifra

Eu ia usar SHA1 em vez de 2/512 (como alguns sugerem), por causa dessa citação de cryptsetup FAQ:

5.20 LUKS is broken! It uses SHA-1!

No, it is not. SHA-1 is (academically) broken for finding collisions, but not for using it in a key-derivation function. And that collision vulnerability is for non-iterated use only. And you need the hash-value in verbatim.

This basically means that if you already have a slot-key, and you have set the PBKDF2 iteration count to 1 (it is > 10'000 normally), you could (maybe) derive a different passphrase that gives you the the same slot-key. But if you have the slot-key, you can already unlock the key-slot and get the master key, breaking everything. So basically, this SHA-1 vulnerability allows you to open a LUKS container with high effort when you already have it open.

The real problem here is people that do not understand crypto and claim things are broken just because some mechanism is used that has been broken for a specific different use. The way the mechanism is used matters very much. A hash that is broken for one use can be completely secure for other uses and here it is.

O que eu leio como "não faz sentido usar nada além de SHA-1". Mas então algumas pessoas me dizem que não é exatamente assim. Então eu não sei mais o que pensar.

1b.

Além disso, não consegui encontrar nenhuma informação sobre se a cifra tem alguma influência sobre o desempenho de leitura / gravação / busca do disco, uma vez que o disco esteja desbloqueado e o sistema esteja logado.

Assim, a complexidade da cifra afeta apenas o "desempenho" no estágio de entrada de senha, ou também durante o uso normal do sistema?

2. O algoritmo

Eu tenho lido sobre isso desde alguns dias, mas quanto mais eu leio, mais confuso fico. Tudo o que li diz que o AES é o mais rápido e o Serpent é o mais lento. Mas não de acordo com meu laptop:

$ cryptsetup benchmark
Tests are approximate using memory only (no storage IO).
PBKDF2-sha1       344926 iterations per second
PBKDF2-sha256     198593 iterations per second
PBKDF2-sha512     129007 iterations per second
PBKDF2-ripemd160  271933 iterations per second
PBKDF2-whirlpool  134295 iterations per second
#  Algorithm | Key |  Encryption |  Decryption
     aes-cbc   128b   149.8 MiB/s   147.9 MiB/s
 serpent-cbc   128b    51.0 MiB/s   196.4 MiB/s
 twofish-cbc   128b   127.6 MiB/s   152.5 MiB/s
     aes-cbc   256b   114.3 MiB/s   113.8 MiB/s
 serpent-cbc   256b    51.2 MiB/s   198.9 MiB/s
 twofish-cbc   256b   129.8 MiB/s   167.5 MiB/s
     aes-xts   256b   153.3 MiB/s   150.6 MiB/s
 serpent-xts   256b   176.4 MiB/s   184.1 MiB/s
 twofish-xts   256b   160.8 MiB/s   159.8 MiB/s
     aes-xts   512b   115.4 MiB/s   112.1 MiB/s
 serpent-xts   512b   178.6 MiB/s   184.2 MiB/s
 twofish-xts   512b   160.7 MiB/s   158.9 MiB/s

Portanto, parece que Serpent não é apenas o mais rápido, mas também o mais rápido com a chave mais complexa.

Não deveria ser o contrário? Estou lendo errado ou algo assim?

    
por lockheed 05.01.2014 / 16:44

1 resposta

5

1a - isso realmente não importa tanto assim. cada vez que você usa o hash para a função de derivação de chaves, o LUKS garante que ele será computacionalmente caro. Ele irá simplesmente fazer um loop até que 1 segundo em tempo real tenha passado.

1b - o método de derivação de chave não tem influência no desempenho. a cifra em si faz. cryptsetup benchmark mostra o mesmo.

2 - AES é o mais rápido se sua CPU for moderna o suficiente para suportar instruções AES-NI (aceleração de hardware para AES). Se você for com a serpente agora você pode não ser capaz de utilizar o AES-NI do seu próximo laptop.

# Tests are approximate using memory only (no storage IO).
PBKDF2-sha1      1165084 iterations per second
PBKDF2-sha256     781353 iterations per second
PBKDF2-sha512     588426 iterations per second
PBKDF2-ripemd160  726160 iterations per second
PBKDF2-whirlpool  261882 iterations per second
#  Algorithm | Key |  Encryption |  Decryption
     aes-cbc   128b   692.9 MiB/s  3091.3 MiB/s
 serpent-cbc   128b    94.6 MiB/s   308.6 MiB/s
 twofish-cbc   128b   195.2 MiB/s   378.7 MiB/s
     aes-cbc   256b   519.5 MiB/s  2374.0 MiB/s
 serpent-cbc   256b    96.5 MiB/s   311.3 MiB/s
 twofish-cbc   256b   197.9 MiB/s   378.0 MiB/s
     aes-xts   256b  2630.6 MiB/s  2714.8 MiB/s
 serpent-xts   256b   310.4 MiB/s   303.8 MiB/s
 twofish-xts   256b   367.4 MiB/s   376.6 MiB/s
     aes-xts   512b  2048.6 MiB/s  2076.1 MiB/s
 serpent-xts   512b   317.0 MiB/s   304.2 MiB/s
 twofish-xts   512b   368.7 MiB/s   377.0 MiB/s

Tenha em mente que este benchmark não usa armazenamento, então você deve verificar estes resultados com qualquer armazenamento e sistema de arquivos que você irá usar.

    
por 05.01.2014 / 17:23