PasswordDeriveBytes vs RFC2898DeriveBytes, obsoleto, mas muito mais rápido
-
20-09-2019 - |
Pergunta
Estou trabalhando em uma funcionalidade de criptografia com base em classes herdadas do simetralgorith, como triplides, DES, etc.
Basicamente, há duas opções para gerar chave consistente e IV para minha aula de algoritmo, PasswordDeriveBytes
e Rfc2898DeriveBytes
, ambos herdam da classe abstrata derivybytes.
o PasswordDeriveBytes.GetBytes()
O método é marcado como obsoleto na estrutura .NET, enquanto RFC2898DeriveBytes.GetBytes () é recomendado, pois corresponde ao padrão pbkdf2. No entanto, com base nos meus testes, chamando o mesmo GetBytes()
O método na classe RFC2898DeriveBytes é quase 15 vezes mais lento que o PasswordDeriveBytes
classe, que leva ao uso inesperado da CPU (sempre superior a 50%).
Aqui estão alguns dados de teste:
- Iterações: 100
- Tipo de algoritmo: DES
- Texto original: "Eu sou uma chave de teste, me criptografa, por favor"
- Tempo:
- PasswordDeriveBytes: 99ms
- RFC2898DeriveBytes: 1.373ms
Com base nos testes, o mau desempenho de Rfc2898DeriveBytes
não é aceitável no ambiente de produção.
Alguém já notou esse problema antes? Qualquer solução que eu ainda possa usar uma padrão sem atingir o desempenho? Algum risco de usar um método obsoleto (poderia ser removido na versão futura)?
Obrigado rapazes!
Editar:
Provavelmente eu descobri onde está o problema ... o número de contagem de iteração padrão para PasswordDeriveBytes
é 100, enquanto para Rfc2898DeriveBytes
é 1000. Depois de alterá -los para o mesmo número que 1000, executando Rfc2898DeriveBytes
é apenas tempo duplo.
Solução
Este blogpost fala sobre as diferenças entre os dois: http://blogs.msdn.com/shawnfa/archive/2004/04/14/generating-a-key-from-a-password.aspx
Outras dicas
Eles não são a mesma coisa.
RFC2898DeriveBytes é uma implementação do PBKDF2. PasswordDeriveBytes é uma implementação do PBKDF1. O PBKDF2 gera uma saída diferente, usando um método diferente e um número muito maior de rodadas que o PBKDF1.
As funções de hash de senha, como essas, que são usadas para a derivação das chaves, devem ser lentas. Esse é o ponto - isso os torna muito mais difíceis de quebrar.
As duas funções não são compatíveis e o PasswordDeriveBytes não é tão seguro.
Eu acho que você está perdendo o ponto dos derivados. É suposto ser lento. Ele usa intencionalmente algoritmo lento, que não pode ser acelerado por truques inteligentes. O parâmetro típico "número de iterações" deve estar na faixa de 2^16-2^20 e introduzir um atraso de 0,1-0,5 segundo entre a senha de entrada do usuário e a chave é gerada. A intenção é se defender contra senhas fracas selecionadas por "usuários ignorantes preguiçosos" e desacelerar a pesquisa de força bruta.