Как я могу создать хеш MD5? - PullRequest
       207

Как я могу создать хеш MD5?

952 голосов
/ 06 января 2009

Есть ли какой-нибудь метод для генерации MD5-хеша строки в Java?

Ответы [ 33 ]

673 голосов
/ 06 января 2009

Класс MessageDigest может предоставить вам экземпляр дайджеста MD5.

При работе со строками и классами шифрования обязательно всегда укажите кодировку, в которой вы хотите представление байта. Если вы просто используете string.getBytes(), он будет использовать платформу по умолчанию. (Не все платформы используют одинаковые значения по умолчанию)

import java.security.*;

..

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

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

Если у вас много данных, взгляните на метод .update(byte[]), который можно вызывать повторно. Затем вызовите .digest(), чтобы получить полученный хеш.

571 голосов
/ 06 января 2009

java.security.MessageDigest ваш друг. Позвоните getInstance("MD5"), чтобы получить дайджест сообщения MD5, который вы можете использовать.

255 голосов
/ 07 января 2009

Если вы действительно хотите получить ответ в виде строки, а не байтового массива, вы всегда можете сделать что-то вроде этого:

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;
}
254 голосов
/ 06 января 2009

Возможно, вы также захотите взглянуть на класс DigestUtils проекта apache commone codec , который предоставляет очень удобные методы для создания дайджестов MD5 или SHA.

156 голосов
/ 04 июля 2011

Нашел это:

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;
}

на сайте ниже, я не беру на себя ответственность, но его решение работает! Для меня много другого кода не работает должным образом, я потерял 0 в хэше. Это похоже на то, что есть в PHP. источник: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093

84 голосов
/ 01 октября 2010

Вот как я это использую:

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));

где Hex: org.apache.commons.codec.binary.Hex из проекта Apache Commons .

82 голосов
/ 31 июля 2011

Я только что скачал commons-codec.jar и получил идеальный php как md5. Вот инструкция .

Просто импортируйте его в свой проект и используйте

String Url = "your_url";

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

и вот оно у вас.

68 голосов
/ 08 мая 2015

Я нашел, что это самый понятный и лаконичный способ сделать это:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
32 голосов
/ 10 мая 2012

Нашел это решение, которое намного чище с точки зрения получения представления String из хеша 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));
    }
}

Код был извлечен из здесь .

31 голосов
/ 24 апреля 2014

Другая реализация:

import javax.xml.bind.DatatypeConverter;

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