sábado, 26 de fevereiro de 2011

Segurança com funções hashing. E o Java?

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