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

Есть ли способ генерировать MD5 хэш строки в Java?

6.01.2009 09:45:12
Leif Gruenwoldt 7.09.2012 20:07:47
MD5 может быть небезопасным в качестве односторонней функции безопасности, но он все еще хорош для универсальных приложений с контрольной суммой.
rustyx 6.02.2015 15:57:07
30 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

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

596
24.08.2019 02:14:28
Одна вещь, которая здесь не упоминается, и застала меня врасплох. Классы MessageDigest НЕ являются потокобезопасными. Если они будут использоваться разными потоками, просто создайте новый, а не пытайтесь использовать их повторно.
mjuarez 7.03.2013 06:34:15
Он использует несколько методов для изменения своего внутреннего состояния. Как отсутствие безопасности ниток может удивлять вообще?
Bombe 25.04.2013 07:57:35
@Bombe: почему мы должны знать о внутреннем состоянии MessageDigest?
Dan Barowy 1.07.2014 14:10:29
@DanBarowy, вы его мутируете (то есть вызываете методы, которые не возвращают значений, но заставляют другие методы возвращать другие значения), поэтому, пока не доказано обратное, вы всегда должны предполагать, что это не безопасно для потоков.
Bombe 9.07.2014 18:17:29
@Traubenfuchs MessageDigestпозволяет вводить данные кусками. Это было бы невозможно с помощью статического метода. Хотя вы можете утверждать, что они должны были добавить один в любом случае для удобства, когда вы можете передать все данные одновременно.
user253751 16.08.2015 12:39:48

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

690
17.12.2013 15:52:55
«LATIN1»! = «ASCII» (или «US-ASCII»). ASCII - это 7-битный набор символов, Latin1 - это 8-битный набор символов. Они не одинаковы.
Bombe 7.01.2009 07:57:02
(см. joelonsoftware.com/articles/Unicode.html для лучшего объяснения и объяснения)
Piskvor left the building 7.01.2009 19:57:22
Этот раздел также полезен, если вам нужно преобразовать полученные байты в шестнадцатеричную строку.
weekens 22.05.2012 07:25:31
Тогда как вы преобразуете этот дайджест в строку, чтобы мы могли вставить ее в mysql?
Humphrey 8.11.2017 08:39:02
А еще лучше, где это возможно yourString.getBytes(StandardCharsets.UTF_8). Это предотвращает обработку UnsupportedEncodingException.
Hummeling Engineering BV 7.03.2019 10:28:30

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

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

16
6.01.2009 10:17:05
Не могли бы вы указать мне некоторые ресурсы, где я могу прочитать об относительных достоинствах и недостатках каждого из них?
Akshay 6.01.2009 10:19:32
Вероятно, лучшее, что вы можете сделать в данный момент, это использовать SHA1 и быть готовым заменить его в будущем. Вы можете использовать новые функции, но они еще не были предметом большого количества исследований. Вы можете отслеживать ресурсы онлайн-безопасности, чтобы узнать, когда это изменится - например, блог Брюса Шнайера.
frankodwyer 6.01.2009 10:49:11
SHA1 является избыточным, если вы не хотите криптографически защищенный хеш, т.е. вы не хотите, чтобы хеш помогал восстановить исходное сообщение, и при этом вы не хотите, чтобы умный злоумышленник создал другое сообщение, которое соответствует хешу. Если оригинал не секрет и хеш не используется для безопасности, MD5 быстр и прост. Например, Google Web Toolkit использует MD5-хэши в URL-адресах JavaScript (например, foo.js? Hash = 12345).
David Leppik 19.04.2011 15:14:31

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

254
28.04.2014 13:57:27
В частности, методы, которые возвращают «безопасные» кодированные представления байтовых данных в виде строки.
Rob 7.01.2009 19:21:45
Однако не существует простого способа вставить класс DigestUtils в ваш проект без добавления тонны библиотек или портирования класса «на руку», который требует как минимум еще двух классов.
iuiz 23.07.2011 20:52:18
Не могу найти его и в репозиториях Maven. Grrrr.
sparkyspider 4.10.2011 16:05:01
Должен быть в центральных репозиториях Maven, если только я не схожу с ума: groupId = commons-codec artifactId = commons-codec version = 1.5
Nick Spacek 12.10.2011 17:10:50

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

6
7.01.2009 03:24:12

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

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;
}
266
18.11.2013 16:33:00
@BalusC: Не верно, метод BigInteger.toString вернет полное число в указанной базе. 0x0606 будет напечатано как 606, пропущены только конечные нули,
Spidey 29.08.2010 22:29:53
Незначительная мелочь: m.reset () не нужен сразу после вызова getInstance. Более незначительный: «ваш текст здесь» требует двойных кавычек.
David Leppik 19.04.2011 15:28:02
Начиная с Java 11, вы можете использовать hashtext = "0".repeat(32 - hashtext.length()) + hashtextвместо while, так что редакторы не будут предупреждать вас о том, что вы делаете конкатенацию строк внутри цикла.
tom 14.05.2019 13:29:26
Вместо m.update (plaintext.getBytes ()); Я бы порекомендовал указать кодировку. такой как m.update (plaintext.getBytes ("UTF-8")); getBytes () не гарантирует кодирование и может варьироваться от системы к системе, что может привести к разным результатам MD5 между системами для одной и той же строки.
user1819780 27.03.2020 05:35:56

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

5
8.01.2009 08:42:23
Что заставляет вас думать, что целостность файлов не является проблемой безопасности?
Jeremy Huiskamp 13.10.2011 00:44:31

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

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 .

87
29.02.2012 08:49:36
Если вы все равно используете кодек Apache Commons, вы можете использовать: commons.apache.org/codec/api-release/org/apache/commons/codec/…
squiddle 25.10.2010 15:10:02
Я бы заменил последнюю строчку на эту:String result = Hex.encodeHexString(resultByte);
bluish 24.05.2011 09:35:36

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

String hash = MD5.asHex(MD5.getHash(new File(filename)));
11
16.03.2011 13:16:30
Это солидная, автономная библиотека с минимальными зависимостями. Хорошая вещь.
Ajax 22.03.2014 08:54:03
Я нахожу это очень полезным. Для файла 4,57 ГБ потребовалось 15357 мс, тогда как для встроенной реализации Java потребовалось 19094 мс.
bkrish 1.05.2016 22:37:24

Нашел это:

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

160
3.07.2011 21:11:33
Вы должны указать кодировку, которая будет использоваться getBytes(), иначе ваш код получит разные результаты на разных платформах / пользовательских настройках.
Paŭlo Ebermann 3.07.2011 21:57:25
@ PaŭloEbermann делает MessageDigest.getInstance ("MD5"); недостаточно? Я попытался добавить «MD5» в getBytes (), но он вернул ошибку
Blaze Tama 19.02.2014 05:29:54
@BlazeTama "MD5" - это не кодировка, это алгоритм дайджеста сообщений (а не тот, который следует использовать в новых приложениях). Кодировка - это пара алгоритмов, которая преобразует байты в строки, а строки в байты. Примером могут быть «UTF-8», «US-ASCII», «ISO-8859-1», «UTF-16BE» и аналогичные. Используйте ту же кодировку, что и для любой другой стороны, которая вычисляет хэш этой строки, иначе вы получите другие результаты.
Paŭlo Ebermann 21.02.2014 19:48:19
Для примера набора символов ... (используйте UTF-8, который является лучшим и наиболее совместимым на мой взгляд) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Richard 25.11.2014 01:56:31
Поскольку это не мое решение, и я сам не тестировал все сценарии, я оставлю его без изменений, хотя я думаю, что задание кодировки и т. Д., Вероятно, хорошая идея.
dac2009 8.07.2019 10:45:59

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

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

String Url = "your_url";

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

и вот оно у тебя.

83
22.07.2013 08:20:20
Этот метод предоставляет то же возвращаемое значение, что и функция MySQL md5 (str). Многие другие ответы вернули другие значения.
rwitzel 18.03.2015 14:54:43
Это не работает должным образом на Android, потому что Android объединяет commons-codec 1.2, для которого вам нужен этот обходной путь: stackoverflow.com/a/9284092/2413303
EpicPandaForce 19.03.2015 10:22:15

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

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.04.2012 17:19:08
и String.format("%1$032X", big)иметь прописные буквы
alex 23.05.2014 15:10:10

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

Код был извлечен отсюда .

34
31.01.2013 09:21:37
Почему этот ответ равен -1, а другой, более короткий и менее описательный ответ имеет +146?
Nilzor 12.02.2013 12:17:30
Хорошо использовать BigInteger, чтобы получить шестнадцатеричное значение +1
Dave.B 14.03.2013 17:42:01
Я только что узнал, что в некоторых случаях это генерирует сумму MD5 длиной всего 31 символ, а не 32, как должно быть
kovica 29.03.2013 14:09:53
@kovica это потому, что начальные нули обрезаются, если я правильно помню .. String.format("%032x", new BigInteger(1, hash)); Это должно решить эту проблему. 'hash' - это байт [] хэша.
Heshan Perera 1.04.2013 05:10:53
Этот ответ содержит ошибку с типом кодировки!
Dawid Drozd 13.04.2015 10:24:02

Я сделал это ... Кажется, работает хорошо - я уверен, что кто-то укажет на ошибки, хотя ...

public final class MD5 {
public enum SaltOption {
    BEFORE, AFTER, BOTH, NONE;
}
private static final String ALG = "MD5";
//For conversion to 2-char hex
private static final char[] digits = {
    '0' , '1' , '2' , '3' , '4' , '5' ,
    '6' , '7' , '8' , '9' , 'a' , 'b' ,
    'c' , 'd' , 'e' , 'f' , 'g' , 'h' ,
    'i' , 'j' , 'k' , 'l' , 'm' , 'n' ,
    'o' , 'p' , 'q' , 'r' , 's' , 't' ,
    'u' , 'v' , 'w' , 'x' , 'y' , 'z'
};

private SaltOption opt;

/**
 * Added the SaltOption constructor since everybody
 * has their own standards when it comes to salting
 * hashes.
 * 
 * This gives the developer the option...
 * 
 * @param option The salt option to use, BEFORE, AFTER, BOTH or NONE.
 */
public MD5(final SaltOption option) {
    //TODO: Add Char Encoding options too... I was too lazy!
    this.opt = option;
}

/**
 * 
 * Returns the salted MD5 checksum of the text passed in as an argument.
 * 
 * If the salt is an empty byte array - no salt is applied.
 * 
 * @param txt The text to run through the MD5 algorithm.
 * @param salt The salt value in bytes.
 * @return The salted MD5 checksum as a <code>byte[]</code>
 * @throws NoSuchAlgorithmException
 */
private byte[] createChecksum(final String txt, final byte[] salt) throws NoSuchAlgorithmException {
    final MessageDigest complete = MessageDigest.getInstance(ALG);
    if(opt.equals(SaltOption.BEFORE) || opt.equals(SaltOption.BOTH)) {
        complete.update(salt);
    }
    complete.update(txt.getBytes());
    if(opt.equals(SaltOption.AFTER) || opt.equals(SaltOption.BOTH)) {
        complete.update(salt);
    }
    return complete.digest();
}

/**
 * 
 * Returns the salted MD5 checksum of the file passed in as an argument.
 * 
 * If the salt is an empty byte array - no salt is applied.
 * 
 * @param fle The file to run through the MD5 algorithm.
 * @param salt The salt value in bytes.
 * @return The salted MD5 checksum as a <code>byte[]</code>
 * @throws IOException
 * @throws NoSuchAlgorithmException
 */
private byte[] createChecksum(final File fle, final byte[] salt)
        throws IOException, NoSuchAlgorithmException {
    final byte[] buffer = new byte[1024];
    final MessageDigest complete = MessageDigest.getInstance(ALG);
            if(opt.equals(SaltOption.BEFORE) || opt.equals(SaltOption.BOTH)) {
            complete.update(salt);
        }
    int numRead;
    InputStream fis = null;
    try {
        fis = new FileInputStream(fle);
        do {
            numRead = fis.read(buffer);
            if (numRead > 0) {
                complete.update(buffer, 0, numRead);
            }
        } while (numRead != -1);
    } finally {
    if (fis != null) {
            fis.close();
        }
    }
            if(opt.equals(SaltOption.AFTER) || opt.equals(SaltOption.BOTH)) {
            complete.update(salt);
        }
    return complete.digest();
}

/**
 * 
 * Efficiently converts a byte array to its 2 char per byte hex equivalent.
 * 
 * This was adapted from JDK code in the Integer class, I just didn't like
 * having to use substrings once I got the result...
 *
 * @param b The byte array to convert
 * @return The converted String, 2 chars per byte...
 */
private String convertToHex(final byte[] b) {
    int x;
    int charPos;
    int radix;
    int mask;
    final char[] buf = new char[32];
    final char[] tmp = new char[3];
    final StringBuilder md5 = new StringBuilder();
    for (int i = 0; i < b.length; i++) {
        x = (b[i] & 0xFF) | 0x100;
        charPos = 32;
        radix = 1 << 4;
        mask = radix - 1;
        do {
            buf[--charPos] = digits[x & mask];
            x >>>= 4;
        } while (x != 0);
        System.arraycopy(buf, charPos, tmp, 0, (32 - charPos));
        md5.append(Arrays.copyOfRange(tmp, 1, 3));
    }
    return md5.toString();
}

/**
 * 
 * Returns the salted MD5 checksum of the file passed in as an argument.
 * 
 * @param fle The file you want want to run through the MD5 algorithm.
 * @param salt The salt value in bytes
 * @return The salted MD5 checksum as a 2 char per byte HEX <code>String</code>
 * @throws NoSuchAlgorithmException
 * @throws IOException
 */
public String getMD5Checksum(final File fle, final byte[] salt)
        throws NoSuchAlgorithmException, IOException {
    return convertToHex(createChecksum(fle, salt));
}

/**
 * 
 * Returns the MD5 checksum of the file passed in as an argument.
 * 
 * @param fle The file you want want to run through the MD5 algorithm.
 * @return The MD5 checksum as a 2 char per byte HEX <code>String</code>
 * @throws NoSuchAlgorithmException
 * @throws IOException
 */
public String getMD5Checksum(final File fle)
        throws NoSuchAlgorithmException, IOException {
    return convertToHex(createChecksum(fle, new byte[0]));
}

/**
 * 
 * Returns the salted MD5 checksum of the text passed in as an argument.
 * 
 * @param txt The text you want want to run through the MD5 algorithm.
 * @param salt The salt value in bytes.
 * @return The salted MD5 checksum as a 2 char per byte HEX <code>String</code>
 * @throws NoSuchAlgorithmException
 * @throws IOException
 */
public String getMD5Checksum(final String txt, final byte[] salt)
        throws NoSuchAlgorithmException {
    return convertToHex(createChecksum(txt, salt));
}

/**
 * 
 * Returns the MD5 checksum of the text passed in as an argument.
 * 
 * @param txt The text you want want to run through the MD5 algorithm.
 * @return The MD5 checksum as a 2 char per byte HEX <code>String</code>
 * @throws NoSuchAlgorithmException
 * @throws IOException
 */
public String getMD5Checksum(final String txt)
        throws NoSuchAlgorithmException {

    return convertToHex(createChecksum(txt, new byte[0]));
}
}
-3
25.06.2012 10:09:34

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

  • загрузить файл с данного 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)
        );
}
11
26.12.2015 12:09:44
О, кстати, прежде чем кто-либо, кроме меня, заметит, насколько плохи мои знания в области JRE: я только что открыл DigestInputStream и DigestOutputStream . Я собираюсь отредактировать свое оригинальное решение, чтобы отразить то, что я только что изучил.
kriegaex 26.06.2012 08:45:12

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

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

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

17
25.09.2012 02:01:14
Кстати, производительность этого намного лучше, чем использование BigInteger для создания представления шестнадцатеричной строки.
James 17.04.2018 09:37:05

Что бы это ни стоило, я наткнулся на это, потому что я хочу синтезировать GUID из естественного ключа для программы, которая будет устанавливать компоненты COM; Я хочу изменить размер, чтобы не управлять жизненным циклом 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.10.2012 17:01:41
на самом деле он принимает не только массив байтов MD5 (размер == 16). Вы можете передать байтовый массив любой длины. Он будет преобразован в массив байтов MD5 с помощью MD5 MessageDigest(см. Исходный код nameUUIDFromBytes () )
Lu55 20.10.2017 22:18:28

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

DigestUtils.md5Hex(_hash);

или

DigestUtils.md5(_hash);

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

23
19.04.2020 13:40:14

Другой вариант заключается в использовании методов хэширования гуавы :

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

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

31
12.11.2012 16:50:22
или используя один из методов ярлыка:Hashing.md5().hashString("my string").asBytes();
Kurt Alfred Kluever 17.11.2015 16:23:45
@KurtAlfredKluever не забудьте вставить кодировку, например 'Hashing.md5 (). HashString ("моя строка", Charsets.UTF_8) .asBytes ()'
Justin 21.04.2016 14:14:10
 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

0
20.10.2013 17:29:20

Вы можете попробовать следующее. Подробности и коды для скачивания смотрите здесь: 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
9.09.2018 21:21:25

Еще одна реализация:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
31
24.04.2014 15:26:17
Я видел только одну строку, которая не использует внешнюю библиотеку.
holmis83 7.02.2017 09:33:34
Если я не ошибаюсь, это всегда возвращает в верхнем регистре, который не будет совпадать с md5, сделанным без использования hex. Даже не совсем уверен, что это настоящий md5
walshie4 29.06.2017 02:00:51
@ walshie4 нет MD5 без hex (см. ietf.org/rfc/rfc1321.txt ), чтобы получить его строчными буквами, просто добавьте .toLower (). Сравните результаты с примерами, например, в en.wikipedia.org/wiki/MD5, и у вас будет больше шансов поверить в правильность кода библиотеки Javas.
stacker 29.06.2017 08:27:18

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

28
11.08.2014 19:43:17
Как сказал @CedricSimon, это именно то, что я искал. Upvote здесь .. Спасибо!
Joabe Lucena 2.12.2016 16:11:22

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

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.01.2015 00:06:43
Это, вероятно, худшее решение, поскольку оно убирает лидирующие нули.
Jannick 13.08.2015 13:02:26

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

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
75
11.04.2016 06:05:10
Отлично. Это не попадает в ловушку сокращения ведущих нулей.
Markus Pscheidt 10.06.2016 07:29:24
Осторожно, это не сработает для Android, если вы используете API уровня <19, но вам просто нужно изменить вторую строку с помощью md5.update (string.getBytes ("UTF-8")); Это добавит еще одно проверенное исключение для обработки, хотя ...
Fran Marzoa 20.02.2018 20:27:17

Я знаю, что вопрос касается Java, но я хотел бы перечислить здесь исходный код ActionScript 1 (здесь лицензия ) для генерации MD5 не так, как ответы, перечисленные на этой странице.

Функция ниже работает хорошо и, несомненно, может быть преобразована в Java:

/* MD5 implementation from http://www.webtoolkit.info */

function md5(string) {

    function RotateLeft(lValue, iShiftBits) {
        return (lValue<<iShiftBits) | (lValue>>>(32-iShiftBits));
    }

    function AddUnsigned(lX,lY) {
        var lX4,lY4,lX8,lY8,lResult;
        lX8 = (lX & 0x80000000);
        lY8 = (lY & 0x80000000);
        lX4 = (lX & 0x40000000);
        lY4 = (lY & 0x40000000);
        lResult = (lX & 0x3FFFFFFF)+(lY & 0x3FFFFFFF);
        if (lX4 & lY4) {
            return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
        }
        if (lX4 | lY4) {
            if (lResult & 0x40000000) {
                return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
            } else {
                return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
            }
        } else {
            return (lResult ^ lX8 ^ lY8);
        }
    }

    function F(x,y,z) { return (x & y) | ((~x) & z); }
    function G(x,y,z) { return (x & z) | (y & (~z)); }
    function H(x,y,z) { return (x ^ y ^ z); }
    function I(x,y,z) { return (y ^ (x | (~z))); }

    function FF(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function GG(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function HH(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function II(a,b,c,d,x,s,ac) {
        a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
        return AddUnsigned(RotateLeft(a, s), b);
    };

    function ConvertToWordArray(string) {
        var lWordCount;
        var lMessageLength = string.length;
        var lNumberOfWords_temp1=lMessageLength + 8;
        var lNumberOfWords_temp2=(lNumberOfWords_temp1-(lNumberOfWords_temp1 % 64))/64;
        var lNumberOfWords = (lNumberOfWords_temp2+1)*16;
        var lWordArray=Array(lNumberOfWords-1);
        var lBytePosition = 0;
        var lByteCount = 0;
        while ( lByteCount < lMessageLength ) {
            lWordCount = (lByteCount-(lByteCount % 4))/4;
            lBytePosition = (lByteCount % 4)*8;
            lWordArray[lWordCount] = (lWordArray[lWordCount] | 
                (string.charCodeAt(lByteCount)<<lBytePosition));
            lByteCount++;
        }
        lWordCount = (lByteCount-(lByteCount % 4))/4;
        lBytePosition = (lByteCount % 4)*8;
        lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80<<lBytePosition);
        lWordArray[lNumberOfWords-2] = lMessageLength<<3;
        lWordArray[lNumberOfWords-1] = lMessageLength>>>29;
        return lWordArray;
    };

    function WordToHex(lValue) {
        var WordToHexValue="",WordToHexValue_temp="",lByte,lCount;
        for (lCount = 0;lCount<=3;lCount++) {
            lByte = (lValue>>>(lCount*8)) & 255;
            WordToHexValue_temp = "0" + lByte.toString(16);
            WordToHexValue = WordToHexValue + 
                WordToHexValue_temp.substr(WordToHexValue_temp.length-2,2);
        }
        return WordToHexValue;
    };

    function Utf8Encode(string) {

        var utftext = "";

        for (var n = 0; n < string.length; n++) {

            var c = string.charCodeAt(n);

            if (c < 128) {
                utftext += String.fromCharCode(c);
            }
            else if((c > 127) && (c < 2048)) {
                utftext += String.fromCharCode((c >> 6) | 192);
                utftext += String.fromCharCode((c & 63) | 128);
            }
            else {
                utftext += String.fromCharCode((c >> 12) | 224);
                utftext += String.fromCharCode(((c >> 6) & 63) | 128);
                utftext += String.fromCharCode((c & 63) | 128);
            }

        }

        return utftext;
    };

    var x=Array();
    var k,AA,BB,CC,DD,a,b,c,d;
    var S11=7, S12=12, S13=17, S14=22;
    var S21=5, S22=9 , S23=14, S24=20;
    var S31=4, S32=11, S33=16, S34=23;
    var S41=6, S42=10, S43=15, S44=21;

    string = Utf8Encode(string);

    x = ConvertToWordArray(string);

    a = 0x67452301; b = 0xEFCDAB89; c = 0x98BADCFE; d = 0x10325476;

    for (k=0;k<x.length;k+=16) {
        AA=a; BB=b; CC=c; DD=d;
        a=FF(a,b,c,d,x[k+0], S11,0xD76AA478);
        d=FF(d,a,b,c,x[k+1], S12,0xE8C7B756);
        c=FF(c,d,a,b,x[k+2], S13,0x242070DB);
        b=FF(b,c,d,a,x[k+3], S14,0xC1BDCEEE);
        a=FF(a,b,c,d,x[k+4], S11,0xF57C0FAF);
        d=FF(d,a,b,c,x[k+5], S12,0x4787C62A);
        c=FF(c,d,a,b,x[k+6], S13,0xA8304613);
        b=FF(b,c,d,a,x[k+7], S14,0xFD469501);
        a=FF(a,b,c,d,x[k+8], S11,0x698098D8);
        d=FF(d,a,b,c,x[k+9], S12,0x8B44F7AF);
        c=FF(c,d,a,b,x[k+10],S13,0xFFFF5BB1);
        b=FF(b,c,d,a,x[k+11],S14,0x895CD7BE);
        a=FF(a,b,c,d,x[k+12],S11,0x6B901122);
        d=FF(d,a,b,c,x[k+13],S12,0xFD987193);
        c=FF(c,d,a,b,x[k+14],S13,0xA679438E);
        b=FF(b,c,d,a,x[k+15],S14,0x49B40821);
        a=GG(a,b,c,d,x[k+1], S21,0xF61E2562);
        d=GG(d,a,b,c,x[k+6], S22,0xC040B340);
        c=GG(c,d,a,b,x[k+11],S23,0x265E5A51);
        b=GG(b,c,d,a,x[k+0], S24,0xE9B6C7AA);
        a=GG(a,b,c,d,x[k+5], S21,0xD62F105D);
        d=GG(d,a,b,c,x[k+10],S22,0x2441453);
        c=GG(c,d,a,b,x[k+15],S23,0xD8A1E681);
        b=GG(b,c,d,a,x[k+4], S24,0xE7D3FBC8);
        a=GG(a,b,c,d,x[k+9], S21,0x21E1CDE6);
        d=GG(d,a,b,c,x[k+14],S22,0xC33707D6);
        c=GG(c,d,a,b,x[k+3], S23,0xF4D50D87);
        b=GG(b,c,d,a,x[k+8], S24,0x455A14ED);
        a=GG(a,b,c,d,x[k+13],S21,0xA9E3E905);
        d=GG(d,a,b,c,x[k+2], S22,0xFCEFA3F8);
        c=GG(c,d,a,b,x[k+7], S23,0x676F02D9);
        b=GG(b,c,d,a,x[k+12],S24,0x8D2A4C8A);
        a=HH(a,b,c,d,x[k+5], S31,0xFFFA3942);
        d=HH(d,a,b,c,x[k+8], S32,0x8771F681);
        c=HH(c,d,a,b,x[k+11],S33,0x6D9D6122);
        b=HH(b,c,d,a,x[k+14],S34,0xFDE5380C);
        a=HH(a,b,c,d,x[k+1], S31,0xA4BEEA44);
        d=HH(d,a,b,c,x[k+4], S32,0x4BDECFA9);
        c=HH(c,d,a,b,x[k+7], S33,0xF6BB4B60);
        b=HH(b,c,d,a,x[k+10],S34,0xBEBFBC70);
        a=HH(a,b,c,d,x[k+13],S31,0x289B7EC6);
        d=HH(d,a,b,c,x[k+0], S32,0xEAA127FA);
        c=HH(c,d,a,b,x[k+3], S33,0xD4EF3085);
        b=HH(b,c,d,a,x[k+6], S34,0x4881D05);
        a=HH(a,b,c,d,x[k+9], S31,0xD9D4D039);
        d=HH(d,a,b,c,x[k+12],S32,0xE6DB99E5);
        c=HH(c,d,a,b,x[k+15],S33,0x1FA27CF8);
        b=HH(b,c,d,a,x[k+2], S34,0xC4AC5665);
        a=II(a,b,c,d,x[k+0], S41,0xF4292244);
        d=II(d,a,b,c,x[k+7], S42,0x432AFF97);
        c=II(c,d,a,b,x[k+14],S43,0xAB9423A7);
        b=II(b,c,d,a,x[k+5
    
-7
1.08.2015 10:16:03

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

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

В отличие от 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
8.12.2018 19:59:09
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("%1$032X", hash);

    } catch (NoSuchAlgorithmException nsae) {
        throw new ServletException("Algorytm szyfrowania nie jest obsługiwany!");
    }
}
-2
11.04.2016 19:39:56
Добро пожаловать в StackOverflow , вы можете прочитать, как опубликовать ответ, прежде чем сделать это. Дайте немного контекста, объясняющего, почему вы опубликовали этот код и что он делает. Также подумайте о том, чтобы найти время для форматирования своего ответа, чтобы читатели могли легко его понять.
Nacho 11.04.2016 17:37:36

этот дает точное значение 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;            
    }

}
4
18.04.2016 15:00:38