Salve pessoal! O tema de hoje é segurança.
E em programação vocês já devem ter escutado (lido) que segurança nunca é demais. E isso se aplica à risca quando o seu sistema será utilizado por um número muito alto de usuários que às vezes podem depositar ali informações extremamente importantes como CPFs, RGs ou até mesmo números de cartão de crédito.
E é pensando nisso que você deve dar uma atenção especial em como manipular os dados de acesso do usuário do seu sistema. E nesse post veremos como reforçar a segurança na criptografia de informações de login.
Use criptografia (de preferência unidirecional)
Primeiramente, se você não utiliza nenhum tipo de criptografia nos dados de acesso ao seu sistema saiba que ele está extremamente vulnerável e se alguém tivesse às informações de sua base de dados ou à lista de usuários ele conseguiria acessar o sistema com privilégios irrestritos. Segundo, se você utiliza um método de encriptação que não seja unidirecional, ou seja, que possa ter seu conteúdo original recuperado (como o Base64), saiba que não adianta praticamente nada.
Prefira métodos unidirecionais, como o MD5 ou o SHA1. O conteúdo gerado por esses métodos são irreversíveis. Assim, mesmo que sua base de dados seja atacada o invasor terá acesso apenas à um conjunto de caracteres que não fazem sentido.
Se é irreversível, como validar?
Quando o usuário for cadastrado será salvo uma hash de sua senha e não a senha realmente digitada. Assim, sempre que ele efetuar o login, a senha digitada no formulário de acesso será criptografada e comparada com a hash cadastrada no banco de dados. Isso validará ou não o acesso ao sistema. Veja:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?php /* Cadastrado um usuário no banco de dados encriptando sua senha */ $Usuario = new Usuario(); $Usuario->nome = 'Rafael'; $Usuario->email = 'rafaelwendel@hotmail.com'; $Usuario->senha = md5('cavalo'); $Usuario->save(); /* Validando login com os dados submetidos de um formulário */ $validar = $Usuario->sql("SELECT * FROM Usuario WHERE email = " . $_POST['email'] . " AND senha = " . md5($_POST['senha']))->execute(); if(count($validar)){ echo 'Login efetuado com sucesso'; } else{ echo 'Usuário e/ou senha incorretos'; } |
Problema?
Uma criptografia MD5 gera um conteúdo que não pode ser descriptografado, mas a string “cavalo” sempre será encriptada para “c965492a50b519451be98427ea60397b”. E se você estiver afim de fazer o teste, colocando essa sequência (criptografada) no Google, em menos de 5 segundos você desvenda o enigma. Ou seja, seu sistema continua vulnerável mesmo usando uma criptografia unidirecional.
Solução!
Concatene uma constante (chave) à senha do usuário quando ele for cadastrado no sistema. Assim, sem o conhecimento dessa chave fica quase impossível o descobrimento de uma senha. Opte por uma chave sem sentido, não sugestiva e que misture caracteres (Ex: GrD34#j):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | <?php /* Cadastrado um usuário no banco de dados encriptando sua senha (com chave) */ $Usuario = new Usuario(); $Usuario->nome = 'Rafael'; $Usuario->email = 'rafaelwendel@hotmail.com'; $Usuario->senha = md5('GrD34#j' . 'cavalo'); $Usuario->save(); /* Validando login (com chave) com os dados submetidos de um formulário */ $validar = $Usuario->sql("SELECT * FROM Usuario WHERE email = " . $_POST['email'] . " AND senha = " . md5('GrD34#j' . $_POST['senha']))->execute(); if(count($validar)){ echo 'Login efetuado com sucesso'; } else{ echo 'Usuário e/ou senha incorretos'; } |
Conclusão
Como disse no início do artigo, segurança nunca é demais. Então esteja preparado para qualquer tipo de ataque ao seu sistema. Aqui abordei apenas um tema sobre segurança mas existem inúmeros outros. Pesquise e estude à respeito.
Abs!
Muito bom !!
Segurança nunca e demais mesmo
Gostei do seu Blog primeira vez que entro.
Olá, gostei muito mesmo de suas dicas e descobri seu blog hoje, agora irei visitar sempre, não sei se é possível ou se já exista e eu não tenha achado uma forma de fazer com que o usuário coloque obrigatoriamente senhas com letras maiúsculas, minusculas, números, caracteres especiais, enfim, deixar a senha forte por obrigatoriedade, gostaria de saber se existe um script assim ou se terei que criar na unha mesmo.
Obrigado pelas dicas e ótimo site este ^_^
Muito bom! Gostei muito das suas dicas.
Rafael, ótimo artigo,
Não sei se ainda atualiza este blog ou cria artigos, mas sugiro uma forma melhor para criptografia de dados como senhas:
PHP Password hash: http://php.net/manual/pt_BR/function.password-hash.php
É bem simples de utilizar e ainda tem o SALT que fortalece mais a criptografia.