Revertendo o processo de criptografia

8 respostas
L

Pessoal,

estou usando a seguinte classe de criptografia:

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException; 

public class Criptografia { 

    private static MessageDigest md = null;

    static {
        try {
            md = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
    } 

	private static char[] hexCodes(byte[] text) {
        char[] hexOutput = new char[text.length * 2];
        String hexString;
        for (int i = 0; i < text.length; i++) {
            hexString = "00" + Integer.toHexString(text[i]);
            hexString.toUpperCase().getChars(hexString.length() - 2,
                                    hexString.length(), hexOutput, i * 2);
        }
        return hexOutput;
	}
  
	public static String criptografar(String pwd) {
        if (md != null) {
            return new String(hexCodes(md.digest(pwd.getBytes())));
        }
        return null;
    }
	
	public static void main(String[] args){
        String senha = "123456";
        System.out.println(Criptografia.criptografar(senha));
	}
}

Gostaria de saber se depois de obter a string criptografada, se tem como eu obter a string original (através de algum metodo, nao sei) passando alguma chave.

Agradeço quem puder me tirar esta dúvida..

8 Respostas

T

A idéia do MD5 é que você não consiga reverter o processo.

É que ele é uma forma de achar um identificador único para seus dados, não de você criptografar alguma coisa.

Pense bem: se você tem um arquivo de 1MB, mas o MD5 desse arquivo (ou de qualquer outra coisa) tem apenas 16 bytes, como é que você consegue “voltar para trás”? O MD5 deveria ter pelo menos 1MB para poder voltar para trás.

T

Vou dar outro exemplo.
O MD5 é como se fosse uma “impressão digital de seus dados”.
Se você tiver 2 pessoas (mesmo que sejam gêmeos idênticos) suas impressões digitais serão diferentes; mas a partir de uma impressão digital é impossível dizer todas as características da pessoa (na verdade você só fica sabendo que ela tinha esse determinado dedo da mão quando ela colheu a impressão digital, é claro).

K

Reverter MD5 é algo computacionalmente inviável, pode-se dizer até que é praticamente impossível para os dias atuais. Algo que piora as coisas é que 2 mensagens podem acabar gerando o mesmo hash MD5. O MD5 mesmo foi propositalmente projetado para não ser revertível. Usam MD5 para “esconder” o conteúdo real das senhas, gravando-se o hash MD5 em algum lugar em vez de guardar a senha numa representação normal. Quando o a senha precisar ser verificada, gera-se MD5 da senha que se quer verificar e compara-se com o hash MD5 da senha gravado em algum lugar.

Inté.

K

Você está confundindo criptografia dados com gerar hash dos dados (que é o caso do md5). Não há como reverter hash pois os dados usados nem estão presentes nele.

L

Entendi,

O que a gente faz com essa classe é criptografar a string do usuario e comparar com uma string já criptografada no bd.

Mas vc conhece alguma maneira de criptografia que se possa trabalhar com chaves e assim poder reverter o processo?

T

http://www.guj.com.br/posts/list/72358.java

Atenção: eu normalmente não recomendaria guardar senhas desse jeito. O correto é simplesmente guardar o hash, conforme todo mundo faz, já que você transfere o ônus de saber a senha para o usuário - as senhas na verdade não estão com você; você só sabe uma “impressão digital” dessa senha.
Se você guardar a senha criptografada de modo que você possa recuperá-la, a responsabilidade passa para você, e você pode ter problemas legais mais tarde.

L

Entendi, o ideal é que somente o usuario saiba sua senha e que ninguem possa descobri-la por outro meio, ou mesmo no proprio servidor.
Eu estou implementando dessa forma.
Eu só tenho essa dúvida, porque estou pesando em outras aplicacoes para isso, nao para dados confidenciais.

L

Valeu mesmo thingol, era isso que estava procurando…

Na minha aplicação eu uso sha-1 (e vai ficar assim).
Mas achei interessante o seu exemplo usando o base64, ele permite fazer o processo inverso, se eu tiver a chave.

Até mais… Obrigado mais uma vez!

Criado 29 de agosto de 2008
Ultima resposta 29 de ago. de 2008
Respostas 8
Participantes 4