Melhor maneira de armazenar senhas no database

Eu estou trabalhando em um projeto que tem que ter autenticação (nome de usuário e senha)

Ele também se conecta a um database, então imaginei que iria armazenar o nome de usuário e senha lá. No entanto, não parece uma boa idéia ter senhas como apenas um campo de texto em uma tabela localizada no database.

Estou usando o C # e conectando-me a um servidor expresso de 2008. Alguém pode sugerir (com tantos exemplos quanto possível) qual seria a melhor maneira de armazenar este tipo de dados?

PS Estou aberto à idéia de que esta informação não seja armazenada no database se uma boa razão puder ser fornecida

Você está certo de que armazenar a senha em um campo de texto simples é uma ideia horrível . No entanto, no que se refere à localização , para a maioria dos casos que você vai encontrar (e honestamente não consigo pensar em nenhum contra-exemplo), armazenar a representação de uma senha no database é a melhor coisa a fazer. Por representação, quero dizer que você quer hash a senha usando um sal (que deve ser diferente para cada usuário) e um algoritmo seguro de 1 via e armazenar isso , jogando fora a senha original. Então, quando você quiser verificar uma senha, você hash o valor (usando o mesmo algoritmo de hash e salt) e compará-lo com o valor do hash no database.

Então, enquanto é uma coisa boa você está pensando sobre isso e é uma boa pergunta, isso é na verdade uma duplicata dessas questões (pelo menos):

  • Como melhor armazenar informações do usuário e login de usuário e senha
  • Práticas recomendadas para armazenar senhas de database
  • Salgar Sua Senha: Melhores Práticas?
  • É sempre ok para armazenar a senha em texto simples em uma variável php ou constante php?

Para esclarecer um pouco mais sobre o bit salgado, o perigo simplesmente com hashing de uma senha e armazenar isso é que, se um invasor conseguir manter seu database, ele ainda poderá usar o que é conhecido como rainbow tables para “descriptografar” o senha (pelo menos aquelas que aparecem na tabela do arco-íris). Para contornar isso, os desenvolvedores adicionam um salt às senhas que, quando feitas corretamente, tornam os ataques do arco-íris simplesmente inviáveis. Observe que um equívoco comum é simplesmente adicionar a mesma string única e longa a todas as senhas; enquanto isso não é horrível , é melhor adicionar sais exclusivos a cada senha. Leia isto para mais.

Background Você nunca … realmente … precisa saber a senha do usuário. Você só quer verificar se um usuário recebido sabe a senha de uma conta.

Hash It: Armazena senhas de usuários com hash (criptografia unidirecional) por meio de uma function hash forte. Uma pesquisa por “c # criptografar senhas” fornece vários exemplos.

Veja o criador de hash SHA1 on – line para ter uma ideia do que uma function hash produz (mas não use SHA1 como uma function hash, use algo mais forte, como SHA256).

Agora, uma senha com hash significa que você (e os ladrões de database) não deveriam conseguir reverter esse hash de volta para a senha original.

Como usá-lo: mas, você diz, como eu uso esta senha mashed armazenada no database?

Quando o usuário fizer login, ele lhe entregará o nome de usuário e a senha (em seu texto original). Você apenas usa o mesmo código hash para codificar a senha digitada para obter a versão armazenada.

Portanto, compare as duas senhas com hash (o hash do database para nome de usuário e a senha digitada e com hash). Você pode dizer se “o que digitou” corresponde “ao que o usuário original digitou para sua senha” comparando seus hashes.

Crédito extra:

Pergunta: Se eu tivesse seu database, não poderia simplesmente pegar um cracker como John the Ripper e começar a fazer hashes até encontrar correspondências para suas senhas armazenadas e com hash? (já que os usuários escolhem palavras curtas de dictionary de qualquer maneira … deve ser fácil)

Resposta: Sim … sim, eles podem.

Então, você deve ‘salgar’ suas senhas. Veja o artigo da Wikipedia sobre sal

Veja “como dados de hash com sal” c # example

Como um hash salgado endurecido por chave, usando um algoritmo seguro como o sha-512.

A melhor prática de segurança não é armazenar a senha (nem mesmo criptografada), mas armazenar o hash salgado (com um único sal por senha) da senha criptografada.

Dessa forma, é (praticamente) impossível recuperar uma senha de texto simples.

Eu recomendo completamente ler os artigos suficiente com as tabelas do arco-íris: o que você precisa saber sobre esquemas de senha segura [link morto, copiar no arquivo de Internet ] e como armazenar com segurança uma senha .

Muitos programadores, inclusive eu, acham que entendem de segurança e hashing. Infelizmente a maioria de nós simplesmente não.

Eu posso estar um pouco fora do assunto, já que você mencionou a necessidade de um nome de usuário e senha, e meu entendimento do assunto não é o melhor, mas OpenID é algo que vale a pena considerar?

Se você usar o OpenID, não armazenará nenhuma credencial se eu entender a tecnologia corretamente e os usuários puderem usar as credenciais que já possuem, evitando a necessidade de criar uma nova identidade específica para seu aplicativo.

Pode não ser adequado se a aplicação em questão for puramente para uso interno

O RPX fornece uma maneira fácil e simples de integrar o suporte ao OpenID em um aplicativo.

Gostaria de MD5 / SHA1 a senha se você não precisa ser capaz de reverter o hash. Quando os usuários fazem login, você pode simplesmente criptografar a senha fornecida e compará-la ao hash. As colisões de hash são quase impossíveis neste caso, a menos que alguém obtenha access ao database e veja um hash para o qual já tenha uma colisão.

Em seu cenário, você pode dar uma olhada na associação do asp.net, é uma boa prática armazenar a senha do usuário como uma string com hash no database. você pode autenticar o usuário comparando a senha de input com hash com aquela armazenada no database.

Tudo foi construído para este fim, confira a associação asp.net