Problemas com criptografia padrão MD5

10 respostas
anjomal

E ai bravos guerreiros JAVANESES da terra média, blz !!! :smiley:

Bom pessoal fiz um Sistema ele criptografa no padrão MD5, so que esta tendo um probleminha na hora de testar se a senha esta correta eu tenho de criptografar a senha de entrada de dados do usuario e bater com a criptografada no meu BANCO DE DADOS, so que o seguinte eu cadastro o usuario ANJOMAL com a senha “MESTRE” blz criptografa, ai o ANJOMAL vai acessar o sistema ele digita “MESTRE” na tela de login eu pego essa entrada e criptografo ela para testar se e igual a que esta no BANCOD DE DADOS (Isso pq não da pra descriptografar MD5 e irreversivel), so que nunca batem cada hora que eu cadastro um usuario com a mesma senha mestre o resultado da criptografia e diferente :?: :?: :?: oque eu estou fazendo de errado ? eu acho que o MD5 faz criptografias diferentes mesmo, mais ai como vou fazer para testar ? ai galera me da uma LUZ !!!

PARA QUE JANELAS SE POSSO VIVER SEM PAREDES !!!
SEJA LIVRE USE LINUX !!!

10 Respostas

Elvis.The.Pelvis

Quando você criptografa, como é que você grava no banco? Uma string HEXA? Uma String montada com os bytes de retorno? Manda exibir o conteudo do banco e a senha criptografada. O resultado deveria ser o mesmo.

Uma vez fui usar criptografia com SQLServer. Só que quando criptografava (não foi no padrão MD5), a senha as vezes vinha com o caracter ‘u0013’ (retorno de carro) ou ‘u0010’ (carriage return). Só que a bost@ do banco truncava a senha quando encontrava um carriage return.

Tivemos que marretar e toda vez que encontrasse um char 10 ou 13, incrementavamos o valor para 11 ou 14. SQLServer eh uma bost@ mesmo. Não sei se é o caso com o interbase. Acredito que não mas… sei lá, de repente…

anjomal

Ai elvis olha só essa e a classe que criptografa os dados,eu gravo seu retorno em um campo do tipo BLOB,e quando quero retornar a senha dou um getString nesse campo. mais ja tentei passar essse campor para char,varchar mair o problema persisite vai ai o codigo segura !!!

package util;

import java.security.*;

public class MD5 {
    
/*  RFC1321 MD5: http://www.faqs.org/rfcs/rfc1321.html
 
    MD5 test suite:
    MD5 ("") = d41d8cd98f00b204e9800998ecf8427e
    MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661
    MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72
    MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0
    MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b
    MD5 ("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789") =
    d174ab98d277d9f5a5611c2c9f419d9f
    MD5 ("12345678901234567890123456789012345678901234567890123456789012345678901234567890") = 57edf4a22be3c955ac49da2e2107b67a
 */
    
    private static String hexDigits = "0123456789abcdef";
    private static MessageDigest md = null;
    
    
    /**
     * Calculates the MD5 hash of str using the
     *    RSA Data Security, Inc. MD5 Message-Digest Algorithm,
     * @return String containing 32 hexadecimal hash or null in case of error.
     */
    public static String md5(String str){
        try{
            if (md == null){
                md = MessageDigest.getInstance("MD5");
            }
            
            byte b[];
            StringBuffer sbuffer = new StringBuffer();
            md.reset();
            b = md.digest( str.getBytes() );
            for (int i = 0; i < 16; i++) {
                int j = ((int) b[i]) & 0xFF;
                sbuffer.append(hexDigits.charAt(j / 16));
                sbuffer.append(hexDigits.charAt(j % 16));
            }
            return sbuffer.toString();
        }
        catch(Exception e){
            System.err.println("Error MD5: "+e.getMessage());
        }
        
        return null;
    }
    
}

e isso ai, ve se vc acha algum erro bom eu não achei anda :frowning: tem alguma coisa haver com o padrão MD5.

t+

Elvis.The.Pelvis

Vou dar uma olhada qd chegar em casa. Se descobrir qquer coisa, edito este post blz???

anjomal

falow
valew !!!

Elvis.The.Pelvis

Ae dos inferno :smiley: .
Criei um projeto no eclipse que usa sua classe para gerar as senhas.
Inseri no banco postgreSQL a senha criptografada.
Depois, faço uma consulta, exibindo a senha recém gravada.
Chamo novamente o md5 em cima da mesma senha e ecomparo os resultados. Veja no que deu (isso é o output do ant):

all:
        [echo] Rodando aplicacao
        //Gero a senha
        [java] "MESTRE" criptografado eh: 55cc1e315cbf9dab702675ff92c7fb35
        //gravo no banco
        [java] Dados inseridos com sucesso.
        //recupero a senha no banco
        [java] Senha cadastrada no banco para o login "ANJOMAL" foi: 55cc1e315cbf9dab702675ff92c7fb35
        //comparo a senha que está gravada no banco com MD5Builder.md5("MESTRE");
        [java] Comparando as senhas...
        [java] Senha bateu
        [echo] Pronto!

Ou seja. Aqui rodou tudo legal. Comparei as senhas da seguinte forma:

stmt = con.prepareStatement("select * from users where login = ?");
    stmt.setString(1, "ANJOMAL");
    ResultSet rs = stmt.executeQuery();
    String senhaNoBanco = null;
  
    if (rs.next()) {
      senhaNoBanco = rs.getString("senha");
    } else {
      throw new RuntimeException("Usuário "ANJOMAL" não encontrado");
    }

    System.out.println("Senha cadastrada no banco para o login "ANJOMAL" " +
        "foi: " + senhaNoBanco);
        
    System.out.println("Comparando as senhas...");
    
    //Renomeei tua classe de MD5 para MD5Builder
    if (MD5Builder.md5("MESTRE").equalsIgnoreCase(senhaNoBanco)) {
      System.out.println("Senha bateu");
    } else {
      System.out.println("Login falhou");
    }

Lembre-se que md5(“MESTRE”); é diferente de md5(“mestre”); que é diferente de md5(“MeStRe”);

[java] "MESTRE" criptografado eh: 55cc1e315cbf9dab702675ff92c7fb35
        [java] "mestre" criptografado eh: 989b731fca676f41b6a48c6ccb0d4801
        [java] "MeStRe" criptografado eh: 36b310074e6890dd9db2b8437668cad8

To mandando o projeto pro teu email.

Rafael_Steil

Elvis, escreve um artigo sobre isso!! Algo simples e direto !!

Rafael

Elvis.The.Pelvis

Blz. Agora tem muito pouco pra falar. O tutorial ia ser bem pequeno.
Notei também que vocês não possuem um tutorial struts. Me permitem?

[Edited]Aí. Onde é que tá o template dos tutoriais.

Rafael_Steil

Opa, mete bala

( o tutorial sobre md5 seria pra ter de forma organizada e mais formal… aki no forum fica meio perdido… )

Rafael

anjomal

Dos infernos :smiley: blz … ficou legal, mais ontem rapaz eu descobri pq as senhas não batiam um bug no JPasswordField, ou um conflito de conceitos meu :shock: eu estava chamando passwd.getPassword().toString() na realidade esse metodo não trasforma o Array de chars em String(era oque eu deduzi) :oops: então fiz uma função dentro do propio equals da classe MD5 em que eu trasformo o Array de chars em uma String Atraves do StringBuffer, somado ao que vc me passou ontem a noite=Problema Resolvido.

Valew Galera !!!

Elvis.The.Pelvis
char[] aChar = {'E', 'l', 'v', 'i', 's'};
    System.out.println(aChar.toString());
    String nome = new String(aChar);
    System.out.println(nome);
    System.out.println("Sacou?");
  }

Output:

[C@601bb1
Elvis
Sacou?
Criado 27 de janeiro de 2003
Ultima resposta 28 de jan. de 2003
Respostas 10
Participantes 3