Como salvar senhas de forma segura no banco de dados?

Hackers Security Password

Seguranças de Senhas no Banco de Dados

Quando aprendemos a programar em uma linguagem de programação ficamos sedentos para aprender a fazer as coisas e aprender e aprender e aprender, porém ignoramos muitas coisas no inicio para encurtar a margem do tempo de aprendizado, no entanto, quando passa um tempo vemos que temos que nos preocupar com algumas coisas importantes como a segurança de nossas aplicações.

Um dos itens de seguranças que nos preocupamos inicialmente é como salvar as senhas dos usuários de forma segura no banco de dados, mesmo que o banco de dados seja em um arquivo. Então vou mostrar uma das várias formas que você pode fazer para salvar suas senhas de forma segura. Existem outras formas porém quero somente deixar essa alternativa para vocês. Eu irei mostrar com códigos PHP, porém a lógica pode ser aplicada em outras linguagens de programação.

 

Nesse tutorial você precisará ter no mínimo:
– Uma tabela no banco de dados com o nome ‘users’ com os campos, ‘password‘, ‘password_salt‘, ‘username‘;
– Um ORM para gerenciar o banco de dados para facilitar ao pegar dados porém irei colocar as SQL para que entenda facilmente;

Vamos imaginar que temos um usuário tentando logar e que informaremos que ele está logado. No momento que em que o formulário passa as informações para serem processadas pegamos os dados e consultamos no banco.

Você um exemplo que você pode usar o mysqli ficaria algo  como:

$username_from_post = $_POST['login'];
$password_from_post = $_POST['password'];

$sql_get_user = 'SELECT * FROM users WHERE username = "'. $mysqli->escape_string($username) .'";'

if ($result = $mysqli->query($sql_get_user)) {

  if ($row = $result->fetch_assoc()) {
  
    if ($row['username'] == $username) {
      
      $user_salt = $row['salt'];
      
      $password_processed = sha1($password_from_post.md5($user_salt));
      
      if ($password_processed == $row['password']) {
      
        header('Location: index.php?logged=true');
        exit();
        
      }
      
    }
    
  } 
  
  header('Location: login_error.php?error_login=true');
  exit();
  
}

Agora com esse código vamos pensar um pouco, pois a importancia disso é na seguinte imagine a seguinte situação: um usuário mal intencionado encontra uma falha no banco de dados e tem acesso ao mesmo, e sendo assim se você salva suas senhas lá sem criptografa-las ele irá ter acesso as senhas dos usuários e isso seria um problema e usando essa lógica de salvar as senhas ele teria que ter acesso também a lógica de programação usada pra criptografar as senhas.

Para facilitar sua vida você pode muito bem criar uma função que faça isso sempre ou até mesmo uma classe para encurtar esse trabalho e até mesmo reaproveitar em outro lugar e não ter que alterar em 2 lugares se um dia for preciso.

No entanto, você pode chegar pra mim e dizer, mas então é só eu salvar as senhas com sha1 ou md5 e pronto o criatura não vai ter que como saber a senha porém ai que se engana meu amigo, pois existem muitos sites que promovem engenharia reversa pra o mesmo, depois visite alguns exemplos no final do post. Depois se quiserem posso explicar como funciona a lógica deles para quebrar essas senhas.

Gostaria de deixar a dica de também usarem os sistemas de criptografia dos frameworks que em muitas linguagens de programação já pensaram nisso e criaram metologias similares ou mais esficazes que visam pensar em outros riscos de segurança aqui somente quero leva-lo a pensar em outras possibilidades que muitos nem se preocupam.

Metologias de Segurança para quem trabalha com web/php
https://www.owasp.org/index.php/OWASP_PHP_Security_Project

Quebradores de Senha Online (salvos com md5 sha1 e outros)
http://www.md5online.org/
http://www.md5decrypter.com/
http://www.hashkiller.co.uk/
https://crackstation.net/
http://md5hashing.net/hashing/sha1

Algumas coisas de segurança que os Frameworks oferece de uma olhada
http://symfony.com/doc/current/book/security.html
http://laravel.com/docs/4.2/security
http://www.yiiframework.com/doc-2.0/guide-security-best-practices.html
http://www.codeigniter.com/user_guide/general/security.html
http://book.cakephp.org/2.0/en/core-libraries/components/security-component.html

Espero que isso te motive a se preocupar mais com a segurança de sua aplicação e que você entenda que não é obrigado a fazer tudo do mais extremo seguro de uma hora pra outra, porém pode ir adotando as melhores metodologias projeto após projeto e ir aprendendo de como fazer melhor e oferecer uma segurança maior para seus clientes e usuários.

Abraços.

, , , , , , , , , , ,

Comments are closed.