Pergunta

A empresa que eu trabalho para assumiu um contrato de suporte para um sistema de processamento de pedidos de grande porte. Como parte da auditoria inicial do sistema notei que as senhas armazenadas no banco de dados eram realmente o hashcode da senha.

Essencialmente:

string pwd = "some pasword";
string securePwd = pwd.GetHashCode();

A minha pergunta é, como seguro ou não é isso?

Eu não estou confortável com isso, mas eu não sei o suficiente sobre como GetHashCode funciona. Eu preferiria usar algo como um hash MD5, mas se eu estou perdendo meu tempo, então eu não vou incomodar.

Foi útil?

Solução

GetHashCode retorna um número inteiro de 32 bits como o valor de hash. Considerando a aniversário paradoxo , não é um valor de hash tempo suficiente devido à probabilidade relativamente elevada de colisões , mesmo que foram explicitamente concebido para ser resistente a colisão, o que não é.

Você deve ir para SHA256 ou outra função hash criptograficamente seguro projetado para lidar com essa tarefa.

Para armazenar senhas, usando apenas uma função hash simples não é suficiente. Você deve adicionar um pouco de "sal" aleatório por vezes usuário e repita o suficiente para que ele iria ser computacionalmente caro à força bruta. Portanto, você deve usar algo como bcrypt, Scrypt , PBKDF2, com um grande número de iterações.

Outras dicas

Você deve usar um hash salgado, criptograficamente forte, como SHA256Managed.

Jeff Attwood tem algumas boas mensagens sobre este tema:

arco-íris Hash Cracking

você está armazenando Provavelmente senhas incorretamente

Não é apenas inseguro, mas também sujeito a alteração:

http://netrsc.blogspot.com/2008/ 08 / GetHashCode-difere-on-systems.html

O valor retornado por GetHashValue para uma determinada entrada mudou no passado.

Não há nenhuma garantia de que vai mesmo ser o mesmo entre diferentes execuções do aplicativo.

Eu recomendo usar bcrypt . Como outros já disse que usar GetHashCode para senhas não é uma boa idéia.

GetHashCode foi definitivamente não é projetado para ser usado desta maneira como a implementação não garante retornos diferentes de hash para diferentes objetos. Isto significa que, potencialmente, várias senhas poderia produzir o mesmo hash. Também não é garantida para retornar o mesmo valor hash em diferentes versões do framework .NET que significa que uma atualização pode potencialmente produzir um hash diferente para a mesma cadeia, tornando suas senhas inutilizáveis ??para você.

É recomendado que você use um hash salgados ou mesmo MD5 em um impulso. Você pode facilmente mudar-lo para algo dentro do Security.Cryptography namespace.

Como já foi dito, GetHashCode não é projetado para o que você está tentando fazer. Há um realmente excelente artigo sobre como lidar com as senhas de usuário de forma segura .

Para resumir o artigo, você precisa usar um esquema de hashing adaptativa relativamente lento, como bcrypt , ou alternativamente a Stanford protocolo Secure remoto senha. Gostaria de sugerir o primeiro. E, claro, você também deve usar um sal.

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