Sal aleatório e chave PBKDF2

Oct 21 2020

Suponha que eu escrevesse uma função $$(salt,IV ) = \text{keyIVGenerator}(passwd)$$que gera um salt aleatório de tamanho 32 bytes e um vetor de inicialização aleatório (IV) de tamanho 16 bytes. Em seguida, use uma função de derivação de chave (KDF) como PBKDF2 para gerar uma chave de comprimento de 32 bytes (dkLen = 32).

$$key = PBKDF2(password, salt, deLen)$$

Eu criei uma função $$ c = encryption(key,data,IV)$$, suponha que o preenchimento dos dados (usando aes CBC) seja feito corretamente e a lógica esteja certa.

Quando peço ao usuário a criptografia e os dados, passo a senha para a função $keyIVGenerator(passwd)$ para obter o $IV,key$, e $passwd$ eles para o $encryption(key,data,iv)$junto com os dados. A criptografia funciona.

E agora suponha que eu precise descriptografar os dados de que precisarei para passar a mesma chave gerada pelo PBKDF2 para criptografar para descriptografar meus dados. O iv foi anexado ao texto cifrado.

Mas e quanto ao sal.

Se eu passar a senha solicitada ao usuário para $keyIVGenerator(passwd)$ ele irá gerar uma nova chave com o novo salt aleatório, portanto, os dados não serão descriptografados.

Devo acrescentar meu sal ao texto cifrado também? Devo manter um banco de dados de sais?

Como faço para gerar a mesma chave de PBKDF2?

Respostas

5 MaartenBodewes Oct 21 2020 at 21:21

Sim, geralmente o salt é prefixado ao texto cifrado.

Em princípio, você sempre gera uma nova chave para cada sal, então pode não precisar do IV. No entanto, eu usaria a saída de PBKDF2 para criar um IV e uma chave aleatórios apenas para ter certeza (por exemplo, usando SHA-512 e, em seguida, usar os 32 mais à esquerda para a chave e os próximos 16 bytes para o IV).

Também é possível usar HKDF na saída de PBKDF2 para separar a chave de dados e o IV da chave intermediária gerada (isso é mais simples, mas também mais difícil de implementar).


Notas:

  • Seria uma boa ideia usar um modo autenticado como o GCM. Nesse caso, o IV deve ter 12 bytes.
  • dkLené especificado em bits, não em bytes - pelo menos no padrão. Os tamanhos das chaves geralmente são.
  • Um salt de 16 bytes é geralmente suficiente, mas 32 bytes também é bom (ele ainda deve caber em um único bloco de até mesmo SHA-256, portanto, provavelmente não influenciará o fator de trabalho criado pela função hash e contagem de iteração).