Java – Criptografia MD5

Sobre a Criptografia MD5

“O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional desenvolvido pela RSA Data Security, Inc., descrito na RFC 1321, e muito utilizado por softwares com protocolo ponto-a-ponto (P2P, ou Peer-to-Peer, em inglês) na verificação de integridade de arquivos e logins.
Foi desenvolvido em 1991 por Ronald Rivest para suceder ao MD4 que tinha alguns problemas de segurança. Por ser um algoritmo unidirecional, uma hash md5 não pode ser transformada novamente no texto que lhe deu origem. O método de verificação é, então, feito pela comparação das duas hash (uma da mensagem original confiável e outra da mensagem recebida). O MD5 também é usado para verificar a integridade de um arquivo através, por exemplo, do programa md5sum, que cria a hash de um arquivo. Isto pode-se tornar muito útil para downloads de arquivos grandes, para programas P2P que constroem o arquivo através de pedaços e estão sujeitos a corrupção dos mesmos. Como autenticação de login é utilizada em vários sistemas operacionais unix e em muitos sites com autentificação.
Em 2008, Ronald Rivest e outros, publicaram uma nova versão do algoritmo o MD6 com hash de tamanhos 224, 256, 384 ou 512 bytes. O algoritmo MD6 iria participar do concurso para ser o novo algoritmo SHA-3, porém logo depois removeu-o do concurso por considerá-lo muito lento, anunciando que os computadores de hoje são muito lentos para usar o MD6.” (Wikipidia – 2012)
Agora vamos ver como seria sua utilização na linguagem Java.

Utilizando no Java

Bom em muitos exemplos que vamos achar na internet, vamos ver uma maneira bem simples como essa:

            String s1 = "teste 3";
            MessageDigest md = MessageDigest.getInstance("MD5");
            BigInteger hash = new BigInteger(1, md.digest(s1.getBytes()));
            String s2 = hash.toString(16);
            System.out.println("M1: " + s2);

            //Saida: "M1: bf99afd7f589db5b524cb34f316277b1"

Porem desta maneira estamos utilizando um BigInteger para converter um array de Bytes em ‘Hexa String’, essa escolha é valida mas temos um problema da conversão com palavras com menos de 32 caracteres que é a falta de 0 a esquerda porcausa dos bits menos significativos, é uma chance de 6.65%, pequena, mas acontece(testem tentando criptografar o valor “teste 3*-+*”), uma outra solução mais viável para a conversão em String seria essa abaixo:

        String texto = "teste 3";
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(texto.getBytes());
        byte[] bytes = md.digest();

        StringBuilder s = new StringBuilder();
        for (int i = 0; i < bytes.length; i++) {
            int parteAlta = ((bytes[i] >> 4) & 0xf) << 4;
            int parteBaixa = bytes[i] & 0xf;
            if (parteAlta == 0) {
                s.append('0');
            }
            s.append(Integer.toHexString(parteAlta | parteBaixa));
        }
        System.out.println("M1: " + s2);

        //Saida: "M1: bf99afd7f589db5b524cb34f316277b1"

O que muda, deslocamos cada byte para a direita e desprezamos o que não seja a quadra menos significativa (& 0xf) e deslocamos de volta para a esquerda; para a parte baixa, é só desprezar o que não for a quadra menos significativa. (complicado não?) (Fonte: http://goo.gl/ei5uB)

Esse é um ótimo método para ser utilizado e que funciona. Muitos dizem que MD5 já está inseguro, realmente nada mais é seguro, mas ainda é uma boa criptografia e muito utilizada.

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair /  Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair /  Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair /  Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair /  Alterar )

Conectando a %s