Comparar duas senhas em hash md5

Boas,

gerei uma senha e guardei no banco de dados em hash md5 da seguinte maneira


public void recebeEGuardaSenhaEmHash(String usuario, String senhaIntroduzidaPeloUtilizador){
public MessageDigest  md ;
    try {
         md = MessageDigest.getInstance("MD5");
        } catch (Exception ex) {
            ex.printStackTrace();
        }

//Aqui ele convert a senha em hash 
md.update(senhaIntroduzidaPeloUtilizador.getBytes());
byte[] hashMd5 = md.digest();

//Aqui imprime a senha em hash
System.out.println(hashMd5.toString());


//este metodo guarda a senha e utilizador no banco de dados como novo usuário.
guardaSenha(usuario, hashMd5.toString());

}

tudo corre bem,… eu vou ao banco de dados e vejo que la estao os dados de utilizador e a senha ja encriptada.

O problema é o seguinte :

Quando um utilizador fornecer a sua senha, como é que eu vou validar esta senha se ela está em hash ?

disseram me que o ideal seria eu converter a senha recebida tambem em hash e comparar as duas. mas o meu problema é saber como faço para retirar a senha do banco e comparar. pois quando eu retiro a senha do banco ela vem como string.

Alguem me pode dar uma judinha com isso

Obrigado !

String senha = "senha";
String outraSenha = "senha";

String md5Senha = md5(senha);
String md5OutraSenha = md5(outraSenha);

if(md5Senha.equals(md5OutraSenha )) {
   //Sim são iguais
}

http://javafree.uol.com.br/artigo/871490/

nao ta dando certo

Voce ta fazendo um cast de um objecto com o nome md5 o que é isso ?

se bem percebi voce ta comparando strings nao é ?

[quote=LuisClaudio]Voce ta fazendo um cast de um objecto com o nome md5 o que é isso ?
[/quote]

Neste pseudo código md5(String str), é um método de gera um hash MD5 e retorna este hash como uma String.

Ola, Por favor tente correr este codigo e me diga porque os resultados nao estao dando certo.

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import sun.misc.BASE64Encoder;

public class encriptar {

    public  void  encripta (String senha) {

        MessageDigest digest;
        String senha2 = "8U3mUqz83TVVkqG7FS55uw=="; //é assim que ele foi guardado no banco, estou simulando que ele tenha vindo do banco

        try {
            digest = MessageDigest.getInstance("MD5");
            digest.update(senha.getBytes());
            BASE64Encoder encoder = new BASE64Encoder();
            
            // Aqui vou imprimir as strings encriptadas e seus tamanhos
            System.out.println("Senha 1 : " + encoder.encode(digest.digest()).toString().trim());
            System.out.println("Tamnaho Senha 1 : " + encoder.encode(digest.digest()).toString().trim().length());

            System.out.println("Senha 2 : " + senha2.trim());
            System.out.println("Tamnaho Senha 1 : " + senha2.trim().length());

            
            //Aqui vou comparar as duas para validar os dados
            if (encoder.encode(digest.digest()).toString().trim().equals(senha2.trim())) {
                System.out.println("Login com sucesso ");
            } else {
                System.out.println("Esta senha é inválida");
            }

        } catch (NoSuchAlgorithmException ns) {
            ns.printStackTrace();

        }

    }

     public static void main(String[] args) {
         
      encriptar ec = new encriptar();
      ec.encripta("luisclaudio");

     }

}

O resultado que ta me dando é o seguinte :

Senha 1 : 8U3mUqz83TVVkqG7FS55uw==
Tamnaho Senha 1 : 24
Senha 2 : 8U3mUqz83TVVkqG7FS55uw==
Tamnaho Senha 1 : 24
Esta senha é inválida

Se as strings aparentemente sao iguais porque estou recebendo que elas nao sao ?

Alguem me pode dizer o que se ta passando ?

Realmente suas senhas são diferentes.

Faz um teste:

 // Aqui vou imprimir as strings encriptadas e seus tamanhos
            System.out.println("Senha 1 : " + encoder.encode(digest.digest()).toString().trim());
        String cript_senha1 = encoder.encode(digest.digest()).toString().trim();
            System.out.println("Tamnaho Senha 1 : " + encoder.encode(digest.digest()).toString().trim().length());

            System.out.println("Senha 2 : " + senha2.trim());
        String cript_senha2 = senha2.trim();
            System.out.println("Tamnaho Senha 1 : " + senha2.trim().length());

Passa seus valores para 2 variaveis, e dai você vai ver o resultado é esse:

cript_senha1 -> 1B2M2Y8AsgTpgAmY7PhCfg==
cript_senha2 -> 8U3mUqz83TVVkqG7FS55uw==

Acabei não explicando acima pq sua senha ficava diferente.

Quando vc usa essa linha encoder.encode(digest.digest()).toString().trim() ela criptografa sua senha. Se vc usar novamente essa linha, ela tipo, vai criptografar o que já foi criptografado.

Não sei o motivo, mas é o que está acontecendo.

Por isso quando vc escreve na tela a senha ela é o resultado experado, e quando faz o teste é outro resultado.

O que deve fazer é criar uma variavel que receba na primeira vez o resultado da criptografia e então testar essa variavel no seu IF.

ok valeu,

ja ta funcionando …

Obrigado !