Esta postagem tem dois objetivos, o primeiro e debater um tema altamente importante se tratando de seguranca da informacao que e a criptografia de dados, tal debate sera acrescido de modos de implementacao da criptografia no mundo java; o segundo e um alerta sobre um possivel problema na implementacao de criptografia utilizando java.Comecando entao pela primeira parte que e o debate sobre a criptografia. Em um dominio mais amplo, creio que a criptografia pode ser considerada uma ciencia a parte e e utilizada para cifrar a linguagem convencional em uma linguagem de codigos onde somente os que conhecem tal codigo poderao saber do que se trata. Por exemplo, posso agora criar um codigo com as seguintes correspondencias de palavras:ciencia = %ac&8jda = 154/*ae2computacao = ',la7 &*Ao transmitir a seguinte mensagem criptografada: %ac&8j 154/*ae2" ',la7 &* ninguem que nao conheca tal codigo que foi determinado entendera o que quer dizer tal mensagem. Bom, ate aqui foi uma ilustracao bem ampla de criptografia so para que esse termo tenha um significado mais solido nas proximas utilizacoes.Voltando para o mundo da computacao, com a popularizacao dos computadores e da internet, surgiu uma grande preocupacao com a seguranca das informacoes manipuladas "digitalmente" e entao a computacao apropriou-se da criptografia para ajudar nessa tarefa de garantir a seguranca da informacao.Afunilando um pouco mais o amplo dominio que estudar a criptografia oferece, vamos tratar de algoritmos de criptografia mais conhecidos e a implementacao de tais algoritmos utilizando Java para que a postagem nao fique demasiadamente extensa.Existem algoritmos de criptografia que fornecem o modo como as informacoes serao criptografadas, dentre os mais famosos, podem ser destacados o SHA-1 e o MD5 que ja possuem implementacoes pre-determinadas em algumas linguagens de programacao como o PHP ou ate mesmo em clientes de SGBD como no Postgre SQL por exemplo.No java nao existe uma implementacao especifica para cada algoritmo de criptografia, mas sim uma implementacao generica onde o Algoritmo que sera utilizado e fornecido como parametro. A implementacao de Algoritmos de criptografia no Java e facilitada pela classe java.security.MessageDigest. Para que seja ilustrado o modo de utilizacao de tal classe, nada como um trecho de codigo: public static String criptografar(String valor) throws NoSuchAlgorithmException { //Note que o Algoritmo de criptografia e fornecido por parametro. //Nesse caso 'MD5' poderia ser 'SHA1'. MessageDigest md = MessageDigest.getInstance("MD5"); //A instancia de MessageDigest foi atualizada com o valor da String //fornecida como parametro, neste caso foi fornecida a codificacao //para obtencao dos bytes da String, mas esse parametro e opcional. md.update(valor.getBytes("UTF8")); //E nesse ponto que e gerado um array de bytes contendo o resultado //da criptografia utilizando o Algoritmo fornecido. byte[] s = md.digest(); //Como precisamos do hash em String precisamos executar os seguintes //tres passos basicos para tal necessidade: BigInteger hash1 = new BigInteger(1, s); String hash = hash1.toString(16); while(hash.length() < 32) { hash = "0" + hash; } return hash; } Bom, essa implementacao e relativamente simples e os comentarios no codigo explicam o funcionamento.Portanto caso esse metodo seja invocado passando uma String qualquer, ira retornar o uma String resultado da criptografia que nao e