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.

Foi útil?

Solução

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top