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

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

30 ответов


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


на 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() для получения полученный хэш.


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


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

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

нашел это:

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

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


вот как я его использую:

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.


Я только что скачал commons-кодек.Джар и получил идеальный php, как md5. Вот руководство.

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

String Url = "your_url";

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

и вот оно.


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

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

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

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


другой вариант-использовать методы хеширования гуавы:

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

удобно, если вы уже используете Guava (который, если вы не, вы, вероятно, должны быть).


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

import javax.xml.bind.DatatypeConverter;

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

у меня есть класс (хэш) для преобразования обычного текста в хэш в форматах: md5 или sha1, simillar, что функции php (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");
    }
}

тестирование с помощью JUnit и PHP

PHP-скрипт:

<?php

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

вывод PHP скрипта:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

использование примера и тестирование с помощью JUnit:

    public class HashTest {

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

}

код в GitHub

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


мой не очень показательный ответ:

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("%12x", i);         
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    return null;
}

нет необходимости делать это слишком сложно. DigestUtils прекрасно работает и делает вас комфортно во время работы с md5 хэшей.

DigestUtils.md5Hex(_hash);

или

DigestUtils.md5(_hash);

Вы можете использовать любые другие методы шифрования, такие как sha или md.


ответ Bombe правильный, однако обратите внимание, что если вы не должны использовать MD5 (например, принудительно для совместимости), лучшим выбором является SHA1, поскольку MD5 имеет недостатки для долгосрочного использования.

Я должен добавить, что SHA1 также имеет теоретические уязвимости, но не такие серьезные. Нынешнее состояние техники в хешировании заключается в том, что существует ряд хеш-функций замены кандидатов, но ни одна из них еще не появилась в качестве стандартной передовой практики для замены SHA1. Так, в зависимости от вашего вам будет полезно сделать ваш хэш-алгоритм настраиваемым, чтобы его можно было заменить в будущем.


есть DigestUtils класс Весна также:

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

этот класс содержит метод md5DigestAsHex() что делает работу.


вы можете попробовать следующие. Подробнее и скачать коды можно здесь: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();
}
}

другая реализация: быстрая реализация MD5 в Java

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

Я не знаю, имеет ли это значение для тех, кто читает это, но у меня просто была проблема, которую я хотел

  • загрузите файл с заданного URL и
  • сравните его MD5 с известным значением.

Я хотел сделать это только с классами JRE (без Apache Commons или подобных). Быстрый веб-поиск не показал мне примеры фрагментов кода, делающих и в то же время, только каждое задание отдельно. Потому что это требует чтения один и тот же файл дважды, я решил, что стоит написать код, который объединяет обе задачи, вычисляя контрольную сумму на лету при загрузке файла. Это мой результат (извините, если это не идеальный Java, но я думаю, вы все равно получите идею):

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

взгляните на следующую ссылку, пример получает хэш MD5 поставляемого изображения: MD5 хэш изображения


для чего это стоит, я наткнулся на это, потому что я хочу синтезировать GUID из естественного ключа для программы, которая установит com-компоненты; я хочу syhthesize, чтобы не управлять жизненным циклом GUID. Я буду использовать MD5, а затем использовать класс UUID, чтобы получить из него строку. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 поднимает этот вопрос).

в любом случае, java.утиль.UUID может получить вам хорошую строку из MD5 байты.

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

MD5 отлично подходит, если вам не нужна лучшая безопасность, и если вы делаете что-то вроде проверки целостности файлов, то безопасность не рассматривается. В таком случае вы можете рассмотреть что-то более простое и быстрое, например Adler32, который также поддерживается библиотеками Java.


попробуйте это:

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

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

это дает точный md5, как вы получаете от функции md5 mysql или функций md5 php и т. д. Это один я использую (вы можете изменить в соответствии с вашими потребностями)

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

}

В отличие от PHP, где вы можете сделать шифрование md5 вашего текста, просто вызвав функцию md5 ie md5($text) в Java это было сделано немного сложнее. Обычно я реализовал его, вызвав функцию, которая возвращает хэш-текст md5. Вот как я его реализовал, сначала создайте функцию с именем md5encryption внутри вашего основного класса, как указано ниже .

public static String md5encryption(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;     
    }

теперь вызовите функцию, когда вам нужно, как указано ниже.

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

здесь вы можете увидеть, что hashtext добавлен с нулем, чтобы он соответствовал шифрованию md5 в PHP.


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)

Это то, для чего я пришел сюда-удобная функция scala, которая возвращает строку MD5 hash:

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

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

об этом есть статья в Codingkit. Проверьте:http://codingkit.com/a/JAVA/2013/1020/2216.html


private String hashuj(String dane) throws ServletException{
    try {
        MessageDigest m = MessageDigest.getInstance("MD5");
        byte[] bufor = dane.getBytes();
        m.update(bufor,0,bufor.length);
        BigInteger hash = new BigInteger(1,m.dige`enter code here`st());
        return String.format("%12X", hash);

    } catch (NoSuchAlgorithmException nsae) {
        throw new ServletException("Algorytm szyfrowania nie jest obsługiwany!");
    }
}