Pergunta

Existe algum método para gerar hash MD5 de uma string em Java?

Foi útil?

Solução

java.security.MessageDigest é seu amigo. Chamada getInstance("MD5") para obter uma mensagem MD5 digerir você pode usar.

Outras dicas

A classe MessageDigest pode fornecer uma instância do MD5.

Ao trabalhar com cordas e as classes de criptografia não se esqueça de sempre especificar a codificação que pretende a representação byte. Se você usar apenas string.getBytes() ele usará o padrão plataforma. (Nem todas as plataformas usam os mesmos padrões)

import java.security.*;

..

byte[] bytesOfMessage = yourString.getBytes("UTF-8");

MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);

Se você tem um monte de dados dê uma olhada no método .update(byte[]) que pode ser chamado repetidamente. Em seguida, chamar .digest() obter o hash resultante.

Se você realmente quer a resposta de volta como uma string ao invés de um array de bytes, você sempre pode fazer algo como isto:

String plaintext = "your text here";
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
String hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
  hashtext = "0"+hashtext;
}

Você também pode querer olhar para o DigestUtils classe dos apache commons codec projeto, que fornece métodos muito convenientes para criar MD5 ou SHA digere.

Encontrei este:

public String MD5(String md5) {
   try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(md5.getBytes());
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; ++i) {
          sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
       }
        return sb.toString();
    } catch (java.security.NoSuchAlgorithmException e) {
    }
    return null;
}

no site abaixo, eu tomar nenhum crédito por isso, mas é uma solução que funciona! Para os lotes me de outro trabalho não funcionavam código corretamente, acabei 0s em hash faltando. Este parece ser o mesmo que o PHP tem. fonte: http://m2tec.be/blog/2010/02/03/java- md5-hex-0093

Aqui está como eu usá-lo:

final MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.reset();
messageDigest.update(string.getBytes(Charset.forName("UTF8")));
final byte[] resultByte = messageDigest.digest();
final String result = new String(Hex.encodeHex(resultByte));

onde Hex é:. org.apache.commons.codec.binary.Hex do Apache Commons projeto

Eu apenas o download commons-codec.jar e tem php perfeito como md5. Aqui está manual do .

Apenas importá-lo para o seu projeto e uso

String Url = "your_url";

System.out.println( DigestUtils.md5Hex( Url ) );

e aí está.

Eu encontrei este para ser a maneira mais clara e concisa para fazê-lo:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));

Outra opção é usar a Goiaba Hashing :

Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();

Handy se você já estiver usando Guava (que se você não for, você provavelmente deve ser).

Encontrado esta solução, que é muito mais limpa em termos de obtenção de uma representação de volta da corda a partir de um hash MD5.

import java.security.*;
import java.math.*;

public class MD5 {
    public static void main(String args[]) throws Exception{
        String s="This is a test";
        MessageDigest m=MessageDigest.getInstance("MD5");
        m.update(s.getBytes(),0,s.length());
        System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16));
    }
}

O código foi extraído aqui .

Outra aplicação:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));

Eu tenho uma classe (Hash) para converter texto simples em hash em formatos: md5 ou sha1, que as funções php simillar ( md5 , sha1 ):

public class Hash {
    /**
     * 
     * @param txt, text in plain format
     * @param hashType MD5 OR SHA1
     * @return hash in hashType 
     */
    public static String getHash(String txt, String hashType) {
        try {
                    java.security.MessageDigest md = java.security.MessageDigest.getInstance(hashType);
                    byte[] array = md.digest(txt.getBytes());
                    StringBuffer sb = new StringBuffer();
                    for (int i = 0; i < array.length; ++i) {
                        sb.append(Integer.toHexString((array[i] & 0xFF) | 0x100).substring(1,3));
                 }
                    return sb.toString();
            } catch (java.security.NoSuchAlgorithmException e) {
                //error action
            }
            return null;
    }

    public static String md5(String txt) {
        return Hash.getHash(txt, "MD5");
    }

    public static String sha1(String txt) {
        return Hash.getHash(txt, "SHA1");
    }
}

Testing com JUnit e PHP

PHP Script:

<?php

echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";

script de saída PHP:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Usando o exemplo e testes com JUnit:

    public class HashTest {

    @Test
    public void test() {
        String txt = "Hello World";
        assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));
        assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));
    }

}

Código em GitHub

https://github.com/fitorec/java-hashes

A minha resposta não é muito reveladora:

private String md5(String s) {
    try {
        MessageDigest m = MessageDigest.getInstance("MD5");
        m.update(s.getBytes(), 0, s.length());
        BigInteger i = new BigInteger(1,m.digest());
        return String.format("%1$032x", i);         
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
}

Não há necessidade de torná-lo muito complicado. DigestUtils obras fino e torná-lo confortável ao trabalhar com hashes MD5.

DigestUtils.md5Hex(_hash);

ou

DigestUtils.md5(_hash);

Ou você pode usar quaisquer outros métodos de criptografia, como sha ou md.

A resposta de Bombe é correto, no entanto nota que a menos que você absolutamente deve usar MD5 (por exemplo forçado em você para interoperabilidade), a melhor opção é SHA1 como MD5 tem pontos fracos para uso a longo prazo.

Devo acrescentar que SHA1 também tem vulnerabilidades teóricas, mas não tão grave. O estado atual da arte em hashing é que há uma série de funções hash substituição candidato, mas nenhuma ainda emergiu como a melhor prática padrão para substituir SHA1. Então, dependendo de suas necessidades você seria bem aconselhados a fazer o seu algoritmo de hash configurável para que ele possa ser substituído no futuro.

Há uma classe DigestUtils em Primavera também:

http: // static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html

Esta classe contém o md5DigestAsHex() método que faz o trabalho.

Você pode tentar a seguinte. Veja detalhes e códigos de download aqui: http://jkssweetlife.com/java-hashgenerator- md5-sha-1 /

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

public class MD5Example {

public static void main(String[] args) throws Exception {

    final String inputString = "Hello MD5";

    System.out.println("MD5 hex for '" + inputString + "' :");
    System.out.println(getMD5Hex(inputString));
}

public static String getMD5Hex(final String inputString) throws NoSuchAlgorithmException {

    MessageDigest md = MessageDigest.getInstance("MD5");
    md.update(inputString.getBytes());

    byte[] digest = md.digest();

    return convertByteToHex(digest);
}

private static String convertByteToHex(byte[] byteData) {

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < byteData.length; i++) {
        sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
    }

    return sb.toString();
}
}

Outra implementação: Implementação MD5 rápida em Java

String hash = MD5.asHex(MD5.getHash(new File(filename)));

Eu não sei se isso é relevante para qualquer um lendo isso, mas eu só tinha o problema que eu queria

  • baixar um arquivo de uma determinada URL e
  • comparar seu MD5 para um valor conhecido.

Eu queria fazê-lo com apenas as classes JRE (sem Commons Apache ou similar). Uma rápida pesquisa na web não me mostrar trechos de código de amostra fazendo ambos ao mesmo tempo, somente cada tarefa separadamente. Porque isto requer para ler o mesmo arquivo duas vezes, achei que poderia valer a pena o tempo para escrever algum código que unifica as duas tarefas, o cálculo da soma de verificação em tempo real durante o download do arquivo. Este é o meu resultado (desculpe se não é perfeito Java, mas eu acho que você começa a idéia de qualquer maneira):

import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigInteger;
import java.net.URL;
import java.nio.ByteBuffer;
import java.nio.channels.Channels;
import java.nio.channels.ReadableByteChannel;
import java.nio.channels.WritableByteChannel;
import java.security.DigestOutputStream;        // new
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

void downloadFile(String fromURL, String toFile, BigInteger md5)
    throws IOException, NoSuchAlgorithmException
{
    ReadableByteChannel in = Channels.newChannel(new URL(fromURL).openStream());
    MessageDigest md5Digest = MessageDigest.getInstance("MD5");
    WritableByteChannel out = Channels.newChannel(
        //new FileOutputStream(toFile));  // old
        new DigestOutputStream(new FileOutputStream(toFile), md5Digest));  // new
    ByteBuffer buffer = ByteBuffer.allocate(1024 * 1024);  // 1 MB

    while (in.read(buffer) != -1) {
        buffer.flip();
        //md5Digest.update(buffer.asReadOnlyBuffer());  // old
        out.write(buffer);
        buffer.clear();
    }

    BigInteger md5Actual = new BigInteger(1, md5Digest.digest()); 
    if (! md5Actual.equals(md5))
        throw new RuntimeException(
            "MD5 mismatch for file " + toFile +
            ": expected " + md5.toString(16) +
            ", got " + md5Actual.toString(16)
        );
}

Dê uma olhada no seguinte link, o exemplo obtém um hash MD5 de uma imagem fornecida: MD5 Hash de uma imagem

Por que vale a pena, me deparei com isso porque eu quero GUIDs sintetizar de uma chave natural para um programa que irá instalar componentes COM; Quero syhthesize para não gerenciar o ciclo de vida GUID. Vou usar MD5 e, em seguida, usar a classe UUID para obter uma seqüência de fora. (Http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 levanta esta questão).

Em qualquer caso, java.util.UUID você pode obter um bom string do MD5 bytes.

return UUID.nameUUIDFromBytes(md5Bytes).toString();

MD5 é perfeitamente bem se você não precisa a melhor segurança, e se você está fazendo algo como a verificação de integridade de arquivos, em seguida, a segurança não é uma consideração. Em tais como caso você pode querer considerar algo mais simples e mais rápido, como Adler32, que também é suportado pelas bibliotecas Java.

import java.security.*;
import javax.xml.bind.*;

byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] bytesOfDigest = md.digest(bytesOfMessage);
String digest = DatatypeConverter.printHexBinary(bytesOfDigest).toLowerCase();

tente o seguinte:

public static String getHashMD5(String string) {
    try {
        MessageDigest md = MessageDigest.getInstance("MD5");
        BigInteger bi = new BigInteger(1, md.digest(string.getBytes()));
        return bi.toString(16);
    } catch (NoSuchAlgorithmException ex) {
        Logger.getLogger(MD5Utils.class
                .getName()).log(Level.SEVERE, null, ex);

        return "";
    }
}

este dá o md5 exata como você começa a partir função md5 do MySQL ou funções md5 do PHP etc. Isso é o que eu uso (você pode mudar de acordo com suas necessidades)

public static String md5( String input ) {
    try {
        java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
        byte[] array = md.digest(input.getBytes( "UTF-8" ));
        StringBuffer sb = new StringBuffer();
        for (int i = 0; i < array.length; i++) {
            sb.append( String.format( "%02x", array[i]));
        }
        return sb.toString();
    } catch ( NoSuchAlgorithmException | UnsupportedEncodingException e) {
        return null;            
    }

}
import java.security.MessageDigest

val digest = MessageDigest.getInstance("MD5")

//Quick MD5 of text
val text = "MD5 this text!"
val md5hash1 = digest.digest(text.getBytes).map("%02x".format(_)).mkString

//MD5 of text with updates
digest.update("MD5 ".getBytes())
digest.update("this ".getBytes())
digest.update("text!".getBytes())
val md5hash2 = digest.digest().map(0xFF & _).map("%02x".format(_)).mkString

//Output
println(md5hash1 + " should be the same as " + md5hash2)

Ao contrário de PHP, onde você pode fazer um hash MD5 do texto, apenas a função md5 chamando isto é md5($text), em Java foi feito pouco complicado. I normalmente implementado lo chamando uma função que retorna o texto md5 hash. Aqui está como eu implementou, Primeiro crie uma função chamada md5hashing dentro de sua classe principal como dado abaixo.

public static String md5hashing(String text)
    {   String hashtext = null;
        try 
        {
            String plaintext = text;
            MessageDigest m = MessageDigest.getInstance("MD5");
            m.reset();
            m.update(plaintext.getBytes());
            byte[] digest = m.digest();
            BigInteger bigInt = new BigInteger(1,digest);
            hashtext = bigInt.toString(16);
            // Now we need to zero pad it if you actually want the full 32 chars.
            while(hashtext.length() < 32 ){
              hashtext = "0"+hashtext;   
            }
        } catch (Exception e1) 
        {
            // TODO: handle exception
            JOptionPane.showMessageDialog(null,e1.getClass().getName() + ": " + e1.getMessage());   
        }
        return hashtext;     
    }

Agora, chamar a função sempre que necessário como dado abaixo.

String text = textFieldName.getText();
String pass = md5hashing(text);

Aqui você pode ver que hashtext é anexado com um zero a fazê-lo coincidir com o hash MD5 no PHP.

Este é o que eu vim aqui para-uma função scala útil que retorna seqüência de hash MD5:

def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}

Você pode gerar MD5 hash para um determinado texto, fazendo uso dos métodos na classe MessageDigest no pacote java.security. Abaixo está o trecho de código completo,

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;

public class MD5HashGenerator 
{

   public static void main(String args[]) throws NoSuchAlgorithmException
   {
       String stringToHash = "MyJavaCode"; 
       MessageDigest messageDigest = MessageDigest.getInstance("MD5");
       messageDigest.update(stringToHash.getBytes());
       byte[] digiest = messageDigest.digest();
       String hashedOutput = DatatypeConverter.printHexBinary(digiest);
       System.out.println(hashedOutput);
   }
}

A saída da função MD5 é um hash de 128 bits representado por 32 números hexadecimais.

No caso, se você estiver usando um banco de dados como MySQL, você pode fazer isso de uma forma mais simples também. O Select MD5(“text here”) consulta retornará o hash MD5 do texto no suporte.

 import java.math.BigInteger;
 import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;

/**
* MD5 encryption
*
* @author Hongten
*
*/
public class MD5 {

 public static void main(String[] args) {
     System.out.println(MD5.getMD5("123456"));
 }

 /**
  * Use md5 encoded code value
  *
  * @param sInput
  * clearly
  * @ return md5 encrypted password
  */
 public static String getMD5(String sInput) {

     String algorithm = "";
     if (sInput == null) {
         return "null";
     }
     try {
         algorithm = System.getProperty("MD5.algorithm", "MD5");
     } catch (SecurityException se) {
     }
     MessageDigest md = null;
     try {
         md = MessageDigest.getInstance(algorithm);
     } catch (NoSuchAlgorithmException e) {
         e.printStackTrace();
     }
     byte buffer[] = sInput.getBytes();

     for (int count = 0; count < sInput.length(); count++) {
         md.update(buffer, 0, count);
     }
     byte bDigest[] = md.digest();
     BigInteger bi = new BigInteger(bDigest);
     return (bi.toString(16));
 }
}

Há um artigo sobre Codingkit sobre isso. Confira: http://codingkit.com/a/JAVA/2013/1020/ 2216.html

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top