Estou trabalhando em um projeto que precisa ter autenticação (nome de usuário e senha)
Ele também se conecta a um banco de dados, então pensei em armazenar o nome de usuário e a senha lá. No entanto, não parece uma boa idéia ter senhas, apenas um campo de texto em uma tabela no banco de dados.
Estou usando c # e me conectando a um servidor expresso de 2008. Alguém pode sugerir (com o maior número de exemplos possível) qual seria a melhor maneira de armazenar esse tipo de dados?
PS Estou aberto à idéia de que essas informações não sejam armazenadas no banco de dados, se um bom motivo puder ser fornecido
Respostas:
Você está certo de que armazenar a senha em um campo de texto sem formatação é uma ideia horrível . No entanto, no que diz respeito à localização , na maioria dos casos que você encontrará (e sinceramente não consigo pensar em nenhum contra-exemplo) armazenar a representação de uma senha no banco de dados é a coisa certa a se fazer. Por representação, quero dizer que você deseja fazer o hash da senha usando um salt (que deve ser diferente para cada usuário) e um algoritmo unidirecional seguro e armazene- o , jogando fora a senha original. Então, quando você deseja verificar uma senha, faz o hash do valor (usando o mesmo algoritmo de hash e salt) e o compara ao valor do hash no banco de dados.
Portanto, embora seja bom você estar pensando sobre isso e seja uma boa pergunta, essa é realmente uma duplicata dessas perguntas (pelo menos):
Para esclarecer um pouco mais sobre a questão da salga, o perigo de simplesmente hash uma senha e armazenamento é que, se um invasor conseguir acessar seu banco de dados, ele ainda poderá usar o que é conhecido como tabelas arco-íris para poder "descriptografar" o senha (pelo menos as que aparecem na tabela arco-íris). Para contornar isso, os desenvolvedores adicionam sal à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; Embora isso não seja horrível , é melhor adicionar sais exclusivos a cada senha. Leia isto para mais informações.
fonte
Background Você nunca ... realmente ... precisa saber a senha do usuário. Você só deseja verificar se um usuário que conhece a senha de uma conta.
Hash It: armazene hash de senhas de usuário (criptografia unidirecional) por meio de uma forte função de hash. Uma pesquisa por "senhas de criptografia c #" fornece vários exemplos.
Consulte o criador de hash do SHA1 on - line para obter uma idéia do que uma função de hash produz (mas não use o SHA1 como uma função de hash, use algo mais forte, como o SHA256).
Agora, uma senha com hash significa que você (e os ladrões do banco de dados) não deve poder reverter esse hash de volta para a senha original.
Como usar: Mas, você diz, como uso essa senha compactada armazenada no banco de dados?
Quando o usuário faz login, ele fornece o nome de usuário e a senha (no texto original). Você apenas usa o mesmo código de hash para o hash da senha digitada para obter a versão armazenada.
Portanto, compare as duas senhas com hash (hash do banco de dados para nome de usuário e a senha digitada e com hash). Você pode saber se "o que eles digitaram" correspondeu ao que o usuário original digitou para sua senha "comparando seus hashes.
Crédito extra:
Pergunta: Se eu tivesse seu banco de dados, não poderia simplesmente pegar um cracker como John the Ripper e começar a fazer hashes até encontrar correspondências com suas senhas armazenadas com hash? (já que os usuários escolhem palavras curtas do dicionário de qualquer maneira ... deve ser fácil)
Resposta: Sim ... sim eles podem.
Portanto, você deve 'saltar' suas senhas. Veja o artigo da Wikipedia sobre sal
Consulte o exemplo C # "Como hash de dados com salt"
fonte
Como um hash salgado com proteção de chave, usando um algoritmo seguro como sha-512.
fonte
A melhor prática de segurança não é armazenar a senha (nem mesmo criptografada), mas armazenar o hash salgado (com um sal exclusivo por senha) da senha criptografada.
Dessa forma, é (praticamente) impossível recuperar uma senha de texto sem formatação.
fonte
Eu recomendaria muito a leitura dos artigos O suficiente com as tabelas Rainbow: o que você precisa saber sobre esquemas de senhas seguras [link morto, cópia no arquivo da Internet ] e Como armazenar uma senha com segurança .
Muitos codificadores, inclusive eu, acham que entendem segurança e hash. Infelizmente a maioria de nós simplesmente não.
fonte
Talvez eu esteja um pouco fora do tópico, como você mencionou a necessidade de um nome de usuário e senha, e meu entendimento do problema não é o melhor, mas é algo que vale a pena considerar no OpenID?
Se você usa o OpenID, não acaba armazenando 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 o aplicativo em questão for apenas para uso interno, embora
O RPX fornece uma maneira fácil e agradável de integrar o suporte ao OpenID em um aplicativo.
fonte
No seu cenário, você pode dar uma olhada na associação ao asp.net; é uma boa prática armazenar a senha do usuário como uma seqüência de hash no banco de dados. você pode autenticar o usuário comparando a senha de entrada com hash com a armazenada no banco de dados.
Tudo foi construído para esse fim, confira a associação ao asp.net
fonte
Gostaria MD5 / SHA1 a senha se você não precisa ser capaz de reverter o hash. Quando os usuários acessam, você pode simplesmente criptografar a senha fornecida e compará-la com o hash. As colisões de hash são quase impossíveis nesse caso, a menos que alguém obtenha acesso ao banco de dados e veja um hash para o qual já tem uma colisão.
fonte