O MD5 (Message-Digest algorithm 5) é um algoritmo de hash de 128 bits unidirecional, muito utilizado por softwares com protocolo ponto-a-ponto, verificação de integridade e logins.
Os hashes MD5 de 128-bit (16-byte) são normalmente representados por uma sequência de 32 caracteres hexadecimais. O seguinte mostra uma string ASCII com 43-bytes e o hash correspondente:
MD5("The quick brown fox jumps over the lazy dog")
= 9e107d9d372bb6826bd81d3542a419d6
Vulnerabilidade
Como o MD5 faz apenas uma passagem sobre os dados, se dois prefixos com o mesmo hash forem construídos, um sufixo comum pode ser adicionado a ambos para tornar uma colisão mais provável. Deste modo é possível que duas strings diferentes produzam o mesmo hash.
Vale ressaltar que o MD5 é um algoritmo de mão única! Então se gravarmos dados criptografados no banco (ex. Login/Senha), para fazermos a autenticação é necessário criptografar a string de entrada e comparar com o dado criptografado que está gravado no BD.
Neste post vamos mostrar um exemplo utilizando o algoritmo MD5 para criptografar uma senha afim de gravá-la no banco de dados. Essa técnica pode ser usada para qualquer tipo (ou toda) de informação que trafega pela rede ou que são gravadas no banco.
O MD5 é uma das soluções para criptografar informações, porém esta criptografia já é falha! Hoje já existem procedimentos que quebram este algoritmo, justamente por possuir uma Vulnerabilidade (citada acima).
Uma outra solução é um novo projeto Open Source brasileiro em Java, chamado BR1E.
Então vamos ao código para exemplificar o MD5 no Java / Java ME.
Fonte:
import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import com.twmacinta.util.MD5;
public class MD5Hash extends MIDlet implements CommandListener {
private Display display;
private Form FormTeste;
private TextField textField1;
private TextField textField2;
private Command comandoDeSaida;
private Command comandoCriptografar;
public void startApp() {
display.setCurrent(FormTeste);
}
public void pauseApp() {
}
public void destroyApp(boolean unconditional) {
display.setCurrent(null);
notifyDestroyed();
}
public MD5Hash() {
display = Display.getDisplay(this);
textField1 = new TextField("Senha", null, 120, TextField.ANY);
textField2 = new TextField("Senha Criptografada", null, 120, TextField.ANY);
FormTeste = new Form("Formulário");
FormTeste.append(textField1);
comandoDeSaida = new Command("Sair", Command.EXIT,1);
comandoCriptografar = new Command("Criptografar", Command.OK,1);
FormTeste.addCommand(comandoCriptografar);
FormTeste.addCommand(comandoDeSaida);
FormTeste.setCommandListener(this);
}
public void commandAction(Command comando, Displayable s)
{
if (comando == comandoDeSaida){
destroyApp(false);
}
if (comando == comandoCriptografar){
Criptografar();
}
}
public void Criptografar() {
FormTeste.append(textField2);
//converter o texto em bytes
byte plain[] = textField1.getString().getBytes();
// criar um objeto MD5Hash passando a sequencia de bytes resultante do texto digitado
MD5 md5 = new MD5(plain);
// pegando o resultado hash gerado
byte[] result = md5.doFinal();
// convertendo o conjunto de bytes em hexadecimal e aplicando ao objeto texto do display
textField2.setString(MD5.toHex(result));
}
}
http://pt.wikipedia.org/wiki/MD5
http://mobilepit.com/10/compact-md5-class-library-for-j2me-javame-app.html
http://www.devmedia.com.br/articles/viewcomp.asp?comp=6290&hl=
0 comentários:
Postar um comentário