Pergunta

Estou escrevendo um pequeno aplicativo de desktop que deve ser capaz de criptografar um arquivo de dados e protegê-lo com uma senha (ou seja,é necessário inserir a senha correta para descriptografar).Quero que o arquivo de dados criptografados seja independente e portátil, portanto, a autenticação deve ser incorporada ao arquivo (ou pelo menos é o que presumo).

Tenho uma estratégia que parece viável e lógica com base no que sei (o que provavelmente é suficiente para ser perigosa), mas não tenho ideia se é realmente um bom design ou não.Me conta:isso é loucura?Existe uma maneira melhor/melhor de fazer isso?

  • Passo 1:O usuário insere a senha em texto simples, por exemplo."Minha senha difícil"
  • Passo 2:O aplicativo faz o hash da senha do usuário e usa esse valor como chave simétrica para criptografar/descriptografar o arquivo de dados.por exemplo."MyDifficultPassword" -> "HashedUserPwdAndKey".
  • Etapa 3:O aplicativo faz hash do valor hash da etapa 2 e salva o novo valor no cabeçalho do arquivo de dados (ou seja,a parte não criptografada do arquivo de dados) e usa esse valor para validar a senha do usuário.por exemplo."HashedUserPwdAndKey" -> "HashedValueForAuthentication"

Basicamente, estou extrapolando a maneira comum de implementar senhas de sites (isto é, quando você não está usando OpenID), que é armazenar o hash (salgado) da senha do usuário em seu banco de dados e nunca salvar a senha real .Mas como uso a senha de usuário com hash para a chave de criptografia simétrica, não posso usar o mesmo valor para autenticação.Então, faço o hash novamente, basicamente tratando-o como outra senha, e salvo o valor com hash duplo no arquivo de dados.Dessa forma, posso levar o arquivo para outro PC e descriptografá-lo simplesmente digitando minha senha.

Então, esse design é razoavelmente seguro, ou irremediavelmente ingênuo, ou algo entre os dois?Obrigado!

EDITAR:pergunta de esclarecimento e acompanhamento sobre:Sal.
Achei que o sal precisava ser mantido em segredo para ser útil, mas suas respostas e links sugerem que não é o caso.Por exemplo, esta especificação vinculado por erickson (abaixo) diz:

Assim, a derivação de chave baseada em senha, conforme definida aqui, é uma função de uma senha, um sal e uma contagem de iteração, onde as duas últimas quantidades não precisam ser mantidas em segredo.

Isso significa que eu poderia armazenar o valor salt no mesmo local/arquivo que a chave com hash e ainda ser mais seguro do que se não usasse nenhum sal durante o hash?Como isso funciona?

Um pouco mais de contexto:o arquivo criptografado não deve ser compartilhado ou descriptografado por outras pessoas; na verdade, são dados de um único usuário.Mas gostaria de implantá-lo em um ambiente compartilhado em computadores que não controlo totalmente (por exemplo,no trabalho) e poder migrar/mover os dados simplesmente copiando o arquivo (para poder usá-lo em casa, em diferentes estações de trabalho, etc.).

Foi útil?

Solução

Geração de Chave

Eu recomendaria usar um algoritmo reconhecido como PBKDF2 definido em PKCS #5 versão 2.0 para gerar uma chave a partir da sua senha.É semelhante ao algoritmo que você descreve, mas é capaz de gerar chaves simétricas mais longas para uso com AES.Você deve encontrar uma biblioteca de código aberto que implemente geradores de chaves PBE para diferentes algoritmos.

Formato de arquivo

Você também pode considerar usar o Sintaxe de mensagem criptográfica como um formato para o seu arquivo.Isso exigirá algum estudo de sua parte, mas, novamente, existem bibliotecas para usar e abre a possibilidade de interoperar mais facilmente com outros softwares, como clientes de e-mail habilitados para S/MIME.

Validação de senha

Quanto ao seu desejo de armazenar um hash da senha, se você usar PBKDF2 para gerar a chave, poderá usar um algoritmo de hash de senha padrão (big salt, mil rodadas de hash) para isso e obter valores diferentes.

Alternativamente, você poderia calcular um MAC no conteúdo.É mais provável que uma colisão de hash em uma senha seja útil para um invasor;uma colisão de hash no conteúdo provavelmente será inútil.Mas serviria para informar a um destinatário legítimo que a senha errada foi usada para descriptografia.

Sal criptográfico

Sal ajuda a impedir ataques de dicionário pré-computados.

Suponha que um invasor tenha uma lista de senhas prováveis.Ele pode fazer o hash de cada um e compará-lo com o hash da senha da vítima e ver se corresponde.Se a lista for grande, isso poderá demorar muito.Ele não quer gastar muito tempo em seu próximo alvo, então ele registra o resultado em um “dicionário” onde um hash aponta para a entrada correspondente.Se a lista de senhas for muito, muito longa, ele poderá usar técnicas como Mesa Arco-Íris para economizar algum espaço.

No entanto, suponha que seu próximo alvo tenha salgado sua senha. Mesmo que o invasor saiba o que é o salt, sua tabela pré-computada não vale nada—o salt altera o hash resultante de cada senha.Ele tem que refazer o hash de todas as senhas de sua lista, afixando o salt do alvo na entrada.Cada sal diferente requer um dicionário diferente e, se forem usados ​​sais suficientes, o invasor não terá espaço para armazenar dicionários para todos eles.Negociar espaço para economizar tempo não é mais uma opção;o invasor deve voltar a fazer o hash de cada senha em sua lista para cada alvo que deseja atacar.

Portanto, não é necessário manter o sal em segredo.Garantir que o invasor não tenha um dicionário pré-computado correspondente a esse sal específico é suficiente.

Outras dicas

Como disse Niyaz, a abordagem parece razoável se você usar uma implementação de qualidade de algoritmos fortes, como SHA-265 e AES para hashing e criptografia.Além disso, eu recomendaria usar um Sal para reduzir a possibilidade de criar um dicionário de todos os hashes de senha.

Claro, lendo Bruce Schneierde Criptografia Aplicada também nunca está errado.

Se você estiver usando um algoritmo de hash forte (SHA-2) e um algoritmo de criptografia forte (AES), você se sairá bem com esta abordagem.

Por que não usar uma biblioteca de compactação que suporte arquivos protegidos por senha?Eu usei um arquivo zip protegido por senha contendo conteúdo XML no passado:}

Existe realmente necessidade de salvar a senha com hash no arquivo.Você não pode simplesmente usar a senha (ou senha com hash) com um pouco de sal e criptografar o arquivo com ela.Ao descriptografar, tente descriptografar o arquivo com a senha + salt.Se o usuário fornecer a senha errada, o arquivo descriptografado não estará correto.

A única desvantagem que posso pensar é que se o usuário inserir acidentalmente a senha errada e a descriptografia for lenta, ele terá que esperar para tentar novamente.E, claro, se a senha for esquecida, não há como descriptografar o arquivo.

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