Как я могу генерировать хеш MD5?

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

+969
06 янв. '09 в 9:45
источник поделиться
33 ответа
  • 1
  • 2

Вам нужен java.security.MessageDigest.

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

Вычислите хеш, выполнив одно из следующих действий:

  • Передайте весь ввод как byte[] и вычислите хеш за одну операцию с помощью md.digest(bytes).
  • Накормите MessageDigest один кусок byte[] за один раз, позвонив md.update(bytes). Когда вы закончите добавлять входные байты, вычислите хеш с помощью md.digest().

byte[], возвращаемый md.digest(), является хешем MD5.

+581
06 янв. '09 в 9:47
источник

Класс 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(), чтобы получить полученный хэш.

+680
06 янв. '09 в 9:58
источник
другие ответы

Связанные вопросы


Похожие вопросы

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

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;
}
+257
07 янв. '09 в 19:20
источник

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

+254
06 янв. '09 в 14:51
источник

Найдено следующее:

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

+156
03 июл. '11 в 21:11
источник

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

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.

+86
01 окт. '10 в 10:28
источник

Я только что загрузил commons-codec.jar и получил совершенный php, например md5. Вот руководство.

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

String Url = "your_url";

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

и там у вас есть.

+82
30 июл. '11 в 22:51
источник

Я нашел это наиболее понятным и сжатым способом:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
+69
08 мая '15 в 8:16
источник

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

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

+32
10 мая '12 в 9:18
источник

Другой вариант - использовать методы Guava Hashing:

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

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

+32
12 нояб. '12 в 16:50
источник

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

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
+31
24 апр. '14 в 15:26
источник

У меня есть класс (хэш) для преобразования обычного текста в хэш в форматах: 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 Script:

<?php

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

Выход PHP Script:

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

+28
11 авг. '14 в 19:43
источник

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

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;
}
+22
17 апр. '12 в 17:19
источник

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

DigestUtils.md5Hex(_hash);

или же

DigestUtils.md5(_hash);

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

+21
31 окт. '12 в 13:02
источник

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

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

+16
06 янв. '09 в 10:07
источник

Существует класс DigestUtils в Spring:

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

Этот класс содержит метод md5DigestAsHex(), который выполняет задание.

+16
13 сент. '12 в 9:46
источник

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

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

String hash = MD5.asHex(MD5.getHash(new File(filename)));
+11
16 мар. '11 в 13:16
источник

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

  • загрузите файл с заданного 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)
        );
}
+10
25 июн. '12 в 12:44
источник

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

+6
07 янв. '09 в 3:24
источник

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

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

return UUID.nameUUIDFromBytes(md5Bytes).toString();
+6
26 окт. '12 в 17:01
источник

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

+5
08 янв. '09 в 8:42
источник
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();
+5
29 янв. '18 в 18:12
источник

попробуйте следующее:

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 "";
    }
}
+4
13 янв. '15 в 0:06
источник

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

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

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

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

Здесь вы можете видеть, что к хеш-тексту добавляется ноль, чтобы он соответствовал хешированию md5 в PHP.

+4
26 мар. '16 в 15:23
источник

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

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

}
+4
18 апр. '16 в 15:00
источник
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)
+3
04 янв. '17 в 10:26
источник

Вот что я здесь сделал для удобной функции scala, которая возвращает строку хеша MD5:

def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
+2
20 окт. '15 в 18:27
источник

Вы можете сгенерировать хеш MD5 для данного текста, используя методы из класса MessageDigest в пакете java.security. Ниже приведен фрагмент кода,

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

Выходные данные функции MD5 - это 128-битный хеш, представленный 32 шестнадцатеричными числами.

В случае, если вы используете базу данных, такую как MySQL, вы можете сделать это и более простым способом. Запрос Select MD5('text here') вернет MD5-хеш текста в скобках.

+2
03 янв. '19 в 11:30
источник
 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));
 }
}

В этой статье есть статья о Кодинките. Отъезд: http://codingkit.com/a/JAVA/2013/1020/2216.html

0
20 окт. '13 в 13:33
источник
  • 1
  • 2

Посмотрите другие вопросы по меткам или Задайте вопрос