Um recurso fundamental no desenvolvimento de uma aplicação é a segurança e o controle de acesso, contudo nem sempre tratamos implementação desta camada com a devida importância ou com o devido cuidado que merece. Um dos principais fatores é o fato de primeiro se pensar em “Quem iria fazer isso com minha aplicação!” ou então, “É só um sisteminha de ...”, o fato é que segurança em sistemas de informação não é só conceito e não se restringe a um banco universitário.
Feita toda essa introdução de minha visão sobre a questão, comecemos então a discorrer sobre o início do título do post. A criptografia de dados é um dos senão o mais importante e utilizado recurso quando falamos em segurança de sistemas de informação. Armazenar dados criptografados nos garante que somente quem possui o padrão utilizado saiba o que está contido nesse conteúdo, ou que somente que esteja autorizado possa interpretá-lo ou alterá-lo.
A utilização de “algoritmos de mão única” criptografia assimétrica são comuns para armazenamento de dados que não podem e/ou não devem ser revelados em hipótese alguma. O armazenamento de senhas de usuários de sistemas é o caso mais recorrente desta utilização, senão o melhor caso para utilização deste tipo de criptografia. Isso porque senhas pessoais só quem as cria é quem deve saber o seu conteúdo senão deixaria de ser pessoal.
Para entender melhor pense em uma tela de login de sistema onde os campos usuário e senha são solicitados:
O conteúdo do campo usuário é de conhecimento público e notório, porém o conteúdo do campo senha deve ser de conhecimento de seu dono (usuário que esta realizando o login), perfeito então como armazenar e validar o conteúdo deste campo para garantir que somente o usuário do sistema conheça o conteúdo de sua senha.
Quando for realizado o cadastro de um usuário no sistema, armazena todas as informações como de costume em um banco de dados, em arquivo, etc... porém antes de armazenar a senha do usuário utilize um algoritmo simétrico para proteger o valor da senha, pois a característica de ser um algoritmo de mão única faz que uma vez tenha sido criptografado o valor ninguém mais conseguirá reverter o processo para o obter o conteúdo do valor criptografado.
Alguns algoritmos famosos possuem esta característica dentre eles o MD5, SHA-1, SHA-256... Agora irei explica o restante do título do Post “E o Java?”, quer dizer “E onde fica o Java nesta história” pois bem fica logo ai na sequência:
/** * Exemplo de uso de algoritmos de criptografia hashing * @author Fabio J. Walter */ public class FakeCrypt { /** * Metodo para criptografia utilizando SHA-1 * * * @param word conteudo a ser criptografado * @return {@link String} conteudo criptografado * @throws NoSuchAlgorithmException * @throws UnsupportedEncodingException */ private String encrypt(String word) throws NoSuchAlgorithmException, UnsupportedEncodingException { Base64 base64 = new Base64(); MessageDigest md = MessageDigest.getInstance("SHA-1"); //MessageDigest md = MessageDigest.getInstance("MD5"); //Com MD5 byte[] cryptedDataByteArray = md.digest(word.getBytes("UTF-8")); String cryptedDataString = new String(base64.encode(cryptedDataByteArray), "UTF-8"); return cryptedDataString; } } |
OBS.: Dependência para o exemplo Apache Commons Codec.
A classe Base64 é assunto para outro momento, mas por hora entendamos apenas que com ela o retorno deste método torna-se mais claro.
Com este algoritmo conseguiremos no momento do cadastro do usuário criptografar o conteúdo da senha antes de gravarmos.
Agora voltando ao exemplo de nossa tela de login basta que você:
- Recupere o cadastro do usuário de onde o armazenou utilizando o conteúdo do campo Usuário;
- Criptografe o conteúdo do campo Senha da tela de login;
- E finalmente, compare o conteúdo criptografado da senha digitada com o conteúdo do campo senha armazenado;
Seguindo esta idéia estaremos dando o primeiro passo rumo a garantia de segurança de uma aplicação.
Nenhum comentário:
Postar um comentário