Melhor forma de guardar as senhas na base de dados MYSQL [duplicado]

[[2] esta pergunta já tem uma resposta aqui:

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 ??

 32
php
Author: Jeyaganesh, 2013-02-10

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
 41
Author: C1D, 2017-09-20 20:57:11

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).

 3
Author: Andy0708, 2013-02-10 13:39:39

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.

 2
Author: William N, 2013-02-10 13:40:56

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.

 1
Author: Evaldas Dzimanavicius, 2013-06-23 15:12:34

É 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:

Http://www.php.net/manual/en/function.crypt.php

 0
Author: Nimrod007, 2013-02-10 13:42:34

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.

 0
Author: Bogdan, 2013-02-10 13:43:58