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


1007

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



40
MD5 може бути небезпечним як функція захисту в одну сторону, але вона все ще хороша для загальних програм контрольної суми.
rustyx

ви можете спробувати у php, що дуже легко вирішується.
Анупам Халдкар

Відповіді:


602

Вам потрібно java.security.MessageDigest.

Зателефонуйте, MessageDigest.getInstance("MD5")щоб отримати екземпляр MD5, який MessageDigestви можете використовувати.

Обчисліть хеш, виконавши один із:

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

byte[]Повертається md.digest()є хеш MD5.


144
Одне, що тут не згадується, і мене здивувало. Класи MessageDigest НЕ захищені потоками. Якщо вони будуть використовуватися різними потоками, просто створіть нову, а не намагайтеся їх повторно використовувати.
mjuarez

39
Він використовує кілька методів для мутації свого внутрішнього стану. Як може взагалі дивувати відсутність безпеки ниток?
Бомбе

90
@Bombe: чому ми повинні очікувати, що ми повинні знати про внутрішній стан MessageDigest?
Dan Barowy

28
@DanBarowy ну, які мутують його (тобто виклик методів , які не повертають значення , але викликають інші методи , щоб повертати різні значення) , так що до тих пір , поки не доведено протилежне , ви завжди повинні припускати , що це не поточно-зробити це.
Бомбе

3
@Traubenfuchs MessageDigestдозволяє вводити дані шматками. Це неможливо статичним методом. Хоча ви можете стверджувати, що для зручності передачі всіх даних одразу слід було б додати один.
користувач253751

690

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()щоб отримати отриманий хеш.


"LATIN1"! = "ASCII" (або "US-ASCII"). ASCII - це 7-бітний набір символів, Latin1 - це 8-бітний набір символів. Вони не однакові.
Бомбе

8
(див. joelonsoftware.com/articles/Unicode.html для кращого обґрунтування та пояснення)
Пісквор покинув будівлю

14
Ця тема також корисна, якщо вам потрібно перетворити отримані байти в шістнадцятковий рядок.
тиждень

1
Тоді як вам перетворити цей didigest в рядок, щоб ми могли вставити його в mysql?
Хамфрі

2
А ще краще, де це можливо використовувати yourString.getBytes(StandardCharsets.UTF_8). Це запобігає поводженню з UnsupportedEncodingException.
Hummeling Engineering BV

267

Якщо ви дійсно хочете, щоб відповідь була повернута як рядок на відміну від байтового масиву, ви завжди можете зробити щось подібне:

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

12
@BalusC: Неправда, метод BigInteger.toString поверне повне число в зазначеній базі. 0x0606 буде надруковано як 606, просто пропущені нулі пропущено,
Spidey

11
Незначна нитка: m.reset () не потрібна відразу після виклику getInstance. Більш другорядне: "ваш текст тут" потребує подвійних лапок.
Девід Леппік

З Java 11 ви можете використовувати hashtext = "0".repeat(32 - hashtext.length()) + hashtextзамість того while, щоб редактори не попередили вас про те, що ви робите з'єднання рядків всередині циклу.
tom

Замість m.update (plaintext.getBytes ()); Я рекомендую вказати кодування. наприклад m.update (plaintext.getBytes ("UTF-8")); getBytes () не гарантує кодування і може відрізнятися від системи до системи, що може призвести до різних результатів MD5 між системами для однієї строки.
користувач1819780

256

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


2
Зокрема, методи, які повертають "безпечні" закодовані уявлення даних байтів у рядковій формі.
Роб

4
Однак немає простого способу включити клас DigestUtils у ваш проект без додавання тонни libs або перенесення класу "за руку", що вимагає принаймні ще двох класів.
1111

Неможливо знайти його і в Maven repos. Grrrr.
sparkyspider

5
Має бути в центральних сховищах Maven, якщо тільки я не з’їду з розуму: groupId = commons-codec artifactId = commons-codec version = 1.5
Nick Spacek

160

Виявив це:

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


15
Ви повинні вказати кодування, яке буде використовуватися getBytes(), інакше ваш код отримає різні результати на різних платформах / налаштуваннях користувачів.
Paŭlo Ebermann

@ PaŭloEbermann робить MessageDigest.getInstance ("MD5"); недостатньо? Я намагався додати "MD5" у getBytes (), але це повернуло помилку
Blaze Tama

2
@BlazeTama "MD5" - це не кодування, це алгоритм перебору повідомлень (а не той, який слід використовувати в нових програмах). Кодування - це пара алгоритмів, яка перетворює байти в рядки, а рядки в байти. Прикладом можуть бути "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE" тощо. Використовуйте те саме кодування, що і будь-яка інша сторона, яка обчислює хеш цього рядка, інакше ви отримаєте різні результати.
Paŭlo Ebermann

6
Для прикладу набору символів ... (використовуйте UTF-8, це найкращий і найсумісніший на мій погляд) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Річард

Оскільки це не є моїм рішенням, і я не перевіряв усі сценарії самостійно, я залишаю його незмінною, хоча, думаю, конкретизація кодування тощо, мабуть, є хорошою ідеєю.
dac2009

88

Ось як я ним користуюся:

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 .


14
Якщо ви все-таки використовуєте Apache Commons Codec, ви можете скористатися: commons.apache.org/codec/api-release/org/apache/commons/codec/…
squiddle

13
Я замінив би останній рядок таким:String result = Hex.encodeHexString(resultByte);
синюватий

84

Я тільки що завантажив commons-codec.jar і отримав ідеальний php як md5. Ось посібник .

Просто імпортуйте його у свій проект та використовуйте

String Url = "your_url";

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

і там у вас є.


1
Це метод, який забезпечує те саме повернене значення, що і функція MySQL md5 (str). Багато інших відповідей повернули інші значення.
rwitzel

1
Це не працює прямо на Android , тому що Android пов'язує Вікісховища кодек 1.2, для якого вам потрібно це тимчасове рішення: stackoverflow.com/a/9284092/2413303
EpicPandaForce

76

Я вважав, що це найбільш чіткий і стислий спосіб зробити це:

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

3
Чудово. Він не потрапляє в пастку вирізання провідних нулів.
Маркус Пшейдт

2
Остерігайтеся, що це не буде працювати для Android, якщо ви використовуєте API рівня <19, але вам потрібно просто змінити другий рядок на md5.update (string.getBytes ("UTF-8")); Це додасть ще один перевірений виняток для обробки, хоча ...
Fran Marzoa

34

Знайшов це рішення, яке набагато чистіше в плані повернення 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));
    }
}

Код був вилучений звідси .


2
Чому ця відповідь -1, тоді як інша, коротша та менш описова відповідь має +146?
Nilzor

4
Приємно використовувати BigInteger, щоб отримати шістнадцяткове значення +1
Дейв.B

5
Я щойно з’ясував, що в деяких випадках це генерує лише 31 символ суми MD5, а не 32, як має бути
kovica

3
@kovica це тому, що стартові нулі обрізаються, якщо я пам’ятаю правильно .. String.format("%032x", new BigInteger(1, hash)); Це повинно вирішити це. 'хеш' - байт [] хеша.
Гешан Перера

У цій відповіді є помилка з типом charset!
Давід Дрозд

31

Іншим варіантом є використання методів хешингу Guava :

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

Зручно, якщо ви вже використовуєте Guava (що, якщо ви цього не зробите, ви, мабуть, повинні бути).


3
або використовуючи один із методів швидкого доступу:Hashing.md5().hashString("my string").asBytes();
Курт Альфред Клайвер

4
@KurtAlfredKluever не забудьте вставити таку схему, як "Hashing.md5 (). HashString (" моя рядок ", Charsets.UTF_8) .asBytes () '
Джастін

31

Інша реалізація:

import javax.xml.bind.DatatypeConverter;

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

2
Я бачив лише один вкладиш, який не використовує зовнішню бібліотеку.
holmis83

Якщо я не помиляюсь, це повертається завжди у великому регістрі, який не вирівняється з md5, зробленим без використання шістнадцяткових. Навіть не впевнений, що це справжній md5
walshie4

2
@ walshie4 немає MD5 без шістнадцяткових (див. ietf.org/rfc/rfc1321.txt ), щоб отримати його в малі регістри, просто додайте .toLower (). Порівняйте результати з прикладами, напр. En.wikipedia.org/wiki/MD5, тоді у вас буде більше шансів повірити, що код бібліотеки Javas правильний.
укладальник

28

У мене є клас (Hash) для перетворення простого тексту в хеш у форматах: 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


Як сказав @CedricSimon, саме це я шукав. Оновлення тут .. Дякую!
Joabe Lucena

24

Не потрібно робити це занадто складним.
DigestUtils прекрасно працює і робить вас комфортним під час роботи з md5хешами.

DigestUtils.md5Hex(_hash);

або

DigestUtils.md5(_hash);

Ви також можете використовувати будь-які інші методи шифрування, такі як shaабо md.


22

Моя не дуже показна відповідь:

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

і String.format("%1$032X", big)мати великий формат
алекс

17

Також весною є DigestUtilsклас :

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

Цей клас містить метод, md5DigestAsHex()який виконує завдання.


BTW: Продуктивність цього набагато краща, ніж використання BigInteger для створення шістнадцяткового представлення рядків.
Джеймс

17

Ви можете спробувати наступне. Деталі та коди для завантаження див. Тут: 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

Відповідь Бомбе правильна, проте зауважте, що якщо ви абсолютно не повинні використовувати MD5 (наприклад, вимушені вам для взаємодії), кращим вибором є SHA1, оскільки MD5 має слабкі місця для тривалого використання.

Додам, що SHA1 також має теоретичні вразливості, але не такі серйозні. Сучасний стан техніки хешування полягає в тому, що існує ряд кандидатних хеш-функцій, які замінюються, але жодна з них ще не стала стандартною найкращою практикою заміни SHA1. Отже, залежно від ваших потреб, вам було б радимо зробити свій алгоритм хешування налаштованим, щоб його можна було замінити в майбутньому.


Не могли б ви вказати мені на деякі ресурси, де я можу прочитати про відносні достоїнства та слабкі сторони кожного?
Акшай

Напевно, найкраще, що ви можете зробити на даний момент, це використовувати SHA1 і бути готовим замінити його в майбутньому. Ви можете використовувати новіші функції, але вони ще не піддавалися великій кількості досліджень. Ви можете відстежувати ресурси безпеки в Інтернеті, щоб дізнатися, коли це змінюється - наприклад, блог Брюса Шнейєра.
frankodwyer

7
SHA1 є надмірним, якщо ви не хочете, щоб криптографічно захищений хеш, тобто ви не хочете, щоб хеш допомагав у реконструкції вихідного повідомлення, а також не хочете, щоб спритний зловмисник створив інше повідомлення, яке відповідає хешу. Якщо оригінал не є секретом, а хеш не використовується для безпеки, MD5 швидко і легко. Наприклад, Google Web Toolkit використовує хеші MD5 в URL-адресах JavaScript (наприклад, foo.js? Hash = 12345).
Девід Леппік

12

Інша реалізація: Швидка реалізація MD5 на Java

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

1
Це солідна окрема бібліотека з мінімальними залежностями. Хороший матеріал.
Аякс

Я вважаю це дуже корисним. Для файлу 4,57 ГБ було потрібно 15357 мс, тоді як реалізована версія Java займала 19094 мс.
bkrish

11

Я не знаю, чи це стосується того, хто це читає, але у мене просто була проблема, яку я хотів

  • завантажити файл із заданої 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)
        );
}

1
О BTW, перш ніж хтось, окрім себе, помічає, наскільки насправді мої знання JRE: я щойно відкрив DigestInputStream і DigestOutputStream . Я збираюся редагувати своє оригінальне рішення, щоб відобразити те, що я тільки що дізнався.
kriegaex

6

Перегляньте наступне посилання: Приклад отримує хеш MD5 наданого зображення: MD5 хеш зображення


6

Про те, що це варто, я натрапив на це, тому що хочу синтезувати 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();

насправді він приймає не тільки масив байтів MD5 (розмір == 16). Ви можете передавати байтовий масив будь-якої довжини. Він буде перетворений в масив байтів MD5 за допомогою MD5 MessageDigest(див. Вихідний кодUUIDFromBytes () )
Lu55,

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

6

На відміну від 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.


5

MD5 ідеально підходить, якщо вам не потрібна найкраща безпека, і якщо ви робите щось на зразок перевірки цілісності файлів, то безпека не враховує. У такому випадку ви можете розглянути щось простіше і швидше, наприклад Adler32, яке також підтримується бібліотеками Java.


2
Чому ви вважаєте, що цілісність файлів не є проблемою безпеки?
Джеремі Хуйскамп

5

цей дає точний 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

спробуйте це:

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

2
Це, мабуть, найгірше рішення, оскільки воно позбавляє нульових позицій.
Jannick

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

1
Це мова Котліна?
Ісуру

3
@Isuru виглядає як Scala
gildor

4

Ви можете генерувати хеш 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

Ось що я прийшов сюди - зручна функція масштабування, яка повертає рядок хешу MD5:

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

0
 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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.