Melhor forma de guardar as senhas na base de dados MYSQL [duplicado]
Sim eu sei que guardar senhas em texto simples não é advised.Is há uma maneira melhor e fácil de armazenar senhas para que a aplicação permaneça segura ??
6 answers
Em primeiro lugar, a md5 e a sha1 mostraram-se vulneráveis a ataques de colisão e podem ser apresentadas facilmente (quando vêem se o hash é o mesmo na sua base de dados de senhas comuns).
Existem actualmente duas coisas que são suficientemente seguras para as senhas que pode usar.
O primeiro é o sha512. sha512 é uma sub-versão do SHA2. SHA2 ainda não foi provado ser vulnerável a ataques de colisão e sha512 irá gerar um hash de 512 bits. Aqui está um exemplo de como para utilizar sha512:<?php
hash('sha512',$password);
A outra opção chama-se bcrypt. bcrypt é famoso por seus hashes seguros. Deve ser a mais segura e personalizável.
Antes de começar a usar o bcrypt, tem de verificar se o seu servidor está activo, indique este código:
<?php
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
echo "CRYPT_BLOWFISH is enabled!";
}else {
echo "CRYPT_BLOWFISH is not available";
}
Se ele devolve que está activo, então o próximo passo é fácil, tudo o que precisa de fazer para descodificar uma senha é (nota: para mais personalização, precisa de ver isto como usar bcrypt para hashing passwords em PHP?):
crypt($password, $salt);
Um sal é normalmente uma cadeia aleatória que se adiciona no final de todas as palavras-passe quando se as mistura. Usar um sal significa que se alguém recebe o seu banco de dados, eles não podem verificar os hashs para senhas comuns. Verificar a base de dados é chamado usando uma tabela arco-íris. Você deve sempre usar um sal quando hashing!
Aqui estão as minhas provas para o ataque de colisão SHA1 E MD5. vulnerabilidades:http://www.schneier.com/blog/archives/2012/10/when_will_we_se.html, http://eprint.iacr.org/2010/413.pdf,
http://people.csail.mit.edu/yiqun/SHA1AttackProceedingVersion.pdf,
http://conf.isi.qut.edu.au/auscert/proceedings/2006/gauravaram06collision.pdf e
a Compreensão sha-1 colisão fraqueza
Algoritmos de lavagem como o sha1 e o md5 não são adequados para armazenamento de senhas. Eles são projetados para ser muito eficiente. Isso significa que forçar bruto é muito rápido. Mesmo que um hacker obtenha uma cópia das suas senhas, é muito rápido forçá-lo. Se você usar um sal, ele torna as mesas arco-íris menos eficazes, mas não faz nada contra a força bruta. Usando um algoritmo mais lento torna a força bruta ineficaz. Por exemplo, o algoritmo bcrypt pode ser feito tão lentamente quanto desejar (apenas mudar o Fator de trabalho), e ele usa sais internamente para proteger contra as mesas arco-íris. Se fosse a si, optaria por uma abordagem semelhante (por exemplo, scrypt ou PBKDF2).
Guardar um sal único para o utilizador (gerado a partir do nome de utilizador + e-mail, por exemplo), e guardar uma senha. No login, obter o sal da base de dados e hash salt + senha.
Use o bcrypt para alterar as senhas.
As senhas da base de dados devem ser guardadas encriptadas. Recomenda-se a encriptação One way (hashing), como SHA2, SHA2, WHIRLPOOL, bcrypt Suprimido: MD5 ou SHA1. (aqueles são mais velhos, vulneráveis
Para além disso, pode utilizar um texto aleatório gerado por cada utilizador - 'sal':
$salt = MD5($this->createSalt());
$Password = SHA2($postData['Password'] . $salt);
createSalt()
Neste caso é uma função que gera uma cadeia de caracteres aleatórios.
Editar: ou se você quer mais segurança, você pode até mesmo adicionar 2 sais: $ salt1 . $passar . $salt2
Outra medida de segurança que pode tomar é a inactivação do Utilizador: após 5 (ou qualquer outro número) tentativas de autenticação incorrectas, o utilizador fica bloqueado durante x minutos (15 minutos, por exemplo). Deve minimizar o sucesso dos ataques de Força bruta.
É melhor usar a cripta para guardar senhas em DB
Código de exemplo:
$crypted_pass = crypt($password);
//$pass_from_login is the user entered password
//$crypted_pass is the encryption
if(crypt($pass_from_login,$crypted_pass)) == $crypted_pass)
{
echo("hello user!")
}
Documentação:
Você deve usar uma encriptação de uma forma (que é uma forma de cifrar um valor, de modo que é muito difícil revê-lo). Eu não estou familiarizado com MySQL, mas uma pesquisa rápida mostra que ele tem uma função de senha() que faz exatamente este tipo de criptografia. Na DB, irá guardar o valor encriptado e, quando o utilizador quiser autenticar, você pega na senha que ele forneceu, cifra-a com o mesmo algoritmo / função e, em seguida, verifica se o valor é o mesmo com a senha guardada na base de dados para esse utilizador. Isto pressupõe que a comunicação entre o navegador e o seu servidor é Segura, ou seja, que você usa https.