Jak mogę wygenerować skrót MD5?

1007

Czy jest jakaś metoda generowania skrótu MD5 ciągu znaków w Javie?

Akshay
źródło
40
MD5 może być niebezpieczny jako jednokierunkowa funkcja bezpieczeństwa, ale nadal nadaje się do ogólnych aplikacji sum kontrolnych.
rustyx
możesz spróbować w php, bardzo łatwo rozwiązać.
Anupam Haldkar

Odpowiedzi:

602

Potrzebujesz java.security.MessageDigest .

Zadzwoń, MessageDigest.getInstance("MD5")aby uzyskać instancję MD5MessageDigest której możesz użyć.

Oblicz skrót, wykonując jedną z następujących czynności:

  • Podaj całe dane wejściowe jako a byte[]i oblicz wartość skrótu w jednej operacji za pomocąmd.digest(bytes) .
  • Nakarm MessageDigestjedną byte[]porcję, dzwoniąc md.update(bytes). Po zakończeniu dodawania bajtów wejściowych obliczyć skrót za pomocą md.digest().

byte[]Zwrócony przez md.digest()to hash MD5.

Bombe
źródło
144
Jedna rzecz, o której tu nie wspomniano i zaskoczyła mnie. Klasy MessageDigest NIE są bezpieczne dla wątków. Jeśli będą używane przez różne wątki, po prostu utwórz nowy, zamiast próbować ich ponownie używać.
mjuarez
39
Używa wielu metod do mutowania swojego stanu wewnętrznego. Jak brak bezpieczeństwa wątków może być w ogóle zaskakujący?
Bombe,
90
@Bombe: dlaczego powinniśmy oczekiwać , aby wiedzieć o stanie wewnętrznym MessageDigest?
Dan Barowy
28
@DanBarowy dobrze, mutowania go (czyli wywołanie metody, które nie zwracają wartości, ale powodują inne metody, aby powrócić różne wartości), więc dopóki nie zostanie udowodnione inaczej należy zawsze zakładać, że to nie jest bezpieczny wątku, aby to zrobić.
Bombe,
3
@Traubenfuchs MessageDigestpozwala na wprowadzanie danych w porcjach. Nie byłoby to możliwe przy użyciu metody statycznej. Chociaż możesz argumentować, że i tak powinni byli dodać jeden dla wygody, gdy możesz przekazać wszystkie dane naraz.
user253751,
690

MessageDigestKlasa może dostarczyć instancji MD5.

Podczas pracy z łańcuchami i klasami kryptograficznymi pamiętaj, aby zawsze określać kodowanie, w którym ma być reprezentowana bajt. Jeśli tylko użyjesz string.getBytes(), użyje domyślnej platformy. (Nie wszystkie platformy używają tych samych ustawień domyślnych)

import java.security.*;

..

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

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

Jeśli masz dużo danych, spójrz na .update(byte[])metodę, którą można wywoływać wielokrotnie. Następnie zadzwoń, .digest()aby uzyskać wynikowy skrót.

koreański
źródło
„LATIN1”! = „ASCII” (lub „US-ASCII”). ASCII to 7-bitowy zestaw znaków, Latin1 to 8-bitowy zestaw znaków. One nie są takie same.
Bombe
8
(zobacz joelonsoftware.com/articles/Unicode.html, aby uzyskać lepsze uzasadnienie i wyjaśnienia)
Piskvor opuścił budynek
14
Ten temat jest także przydatny, jeśli chcesz przekonwertować powstałe bajty na ciąg szesnastkowy.
weekendy
1
Jak zatem przekonwertować ten test na ciąg, abyśmy mogli wstawić go do mysql?
Humphrey,
2
Jeszcze lepiej, tam gdzie to możliwe yourString.getBytes(StandardCharsets.UTF_8). Zapobiega to obsłudze UnsupportedEncodingException.
Hummeling Engineering BV
267

Jeśli faktycznie chcesz otrzymać odpowiedź w postaci łańcucha, a nie tablicy bajtów, zawsze możesz zrobić coś takiego:

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;
}
użytkownik49913
źródło
12
@BalusC: Nieprawda, metoda BigInteger.toString zwróci pełną liczbę w określonej bazie. 0x0606 zostanie wydrukowane jako 606, tylko zera końcowe są pomijane,
Spidey
11
Drobny nitpick: m.reset () nie jest konieczny zaraz po wywołaniu getInstance. Bardziej drobne: „Twój tekst tutaj” wymaga podwójnych cudzysłowów.
David Leppik,
Począwszy od wersji Java 11, możesz używać hashtext = "0".repeat(32 - hashtext.length()) + hashtextzamiast niej while, więc redaktorzy nie będą dawać ostrzeżenia, że ​​łączysz łańcuch w pętli.
tom
Zamiast m.update (plaintext.getBytes ()); Poleciłbym określenie kodowania. takich jak m.update (plaintext.getBytes („UTF-8”)); getBytes () nie gwarantuje kodowania i może różnić się w zależności od systemu, co może powodować różne wyniki MD5 między systemami dla tego samego ciągu.
user1819780
256

Możesz także przyjrzeć się klasie DigestUtils projektu kodeka apache commons , który zapewnia bardzo wygodne metody tworzenia skrótów MD5 lub SHA.

lutzh
źródło
2
W szczególności metody zwracające „bezpieczne” zakodowane reprezentacje danych bajtowych w postaci łańcucha.
Rob
4
Jednak nie ma łatwego sposobu na umieszczenie klasy DigestUtils w projekcie bez dodania mnóstwa bibliotek lub przeniesienia klasy „na rękę”, co wymaga co najmniej dwóch dodatkowych klas.
iuiz
Nie można go również znaleźć w repozytoriach maven. Grrrr.
sparkyspider
5
Powinny być w centralnym repozytorium Mavena, chyba że wariuję: GroupID = commons-codec artifactId = commons-codec version = 1,5
Nick Spacek
160

Znajdź to:

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

na poniższej stronie nie biorę za to uznania, ale jest to rozwiązanie, które działa! Dla mnie wiele innych kodów nie działało poprawnie, skończyło mi się na zera w haszu. Ten wydaje się być taki sam jak PHP. źródło: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093

dac2009
źródło
15
Powinieneś określić kodowanie, które ma być użyte, w getBytes()przeciwnym razie twój kod uzyska inne wyniki na różnych platformach / ustawieniach użytkownika.
Paŭlo Ebermann
@ PaŭloEbermann wykonuje MessageDigest.getInstance („MD5”); niewystarczająco? Próbowałem dodać „MD5” w getBytes (), ale zwrócił błąd
Blaze Tama
2
@BlazeTama „MD5” nie jest kodowaniem, jest to algorytm podsumowania wiadomości (i nie taki, który powinien być używany w nowych aplikacjach). Kodowanie to para algorytmów, która przekształca bajty na ciągi i ciągi na bajty. Przykładem może być „UTF-8”, „US-ASCII”, „ISO-8859-1”, „UTF-16BE” i podobne. Użyj tego samego kodowania, co każda inna strona, która oblicza skrót tego ciągu, w przeciwnym razie otrzymasz inne wyniki.
Paŭlo Ebermann
6
Na przykład zestaw znaków ... (użyj UTF-8, który moim zdaniem jest najlepszy i najbardziej kompatybilny) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Richard
Ponieważ nie jest to moje rozwiązanie i sam nie testowałem wszystkich scenariuszy, pozostawiam je bez zmian, chociaż myślę, że podanie kodowania itp. Jest prawdopodobnie dobrym pomysłem.
dac2009
88

Oto jak go używam:

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

gdzie Hex: org.apache.commons.codec.binary.Hexz projektu Apache Commons .

adranale
źródło
14
Jeśli mimo wszystko korzystasz z Apache Commons Codec, możesz użyć: commons.apache.org/codec/api-release/org/apache/commons/codec/…
squiddle 25.10.10
13
Ostatnią linię zastąpiłbym następującą:String result = Hex.encodeHexString(resultByte);
niebieskawy
84

Właśnie pobrałem plik commons-codec.jar i uzyskałem doskonały php, taki jak md5. Oto instrukcja .

Po prostu zaimportuj go do swojego projektu i użyj

String Url = "your_url";

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

i masz to.

Eugene
źródło
1
Jest to metoda, która zapewnia taką samą wartość zwracaną jak funkcja MySQL md5 (str). Wiele innych odpowiedzi zwróciło inne wartości.
rwitzel
1
Nie działa to poprawnie na Androidzie, ponieważ Android dołącza kodek commons 1.2, dla którego potrzebujesz tego obejścia: stackoverflow.com/a/9284092/2413303
EpicPandaForce
76

Uważam, że jest to najbardziej jasny i zwięzły sposób:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
rednoah
źródło
3
Świetny. Nie wpada w pułapkę wycinania zer wiodących.
Markus Pscheidt,
2
Uwaga: to nie będzie działać na Androidzie, jeśli używasz interfejsu API na poziomie <19, ale wystarczy zmienić drugą linię za pomocą md5.update (string.getBytes („UTF-8”)); To doda jeszcze jeden sprawdzony wyjątek do obsługi, ale ...
Fran Marzoa
34

Znalazłem to rozwiązanie, które jest o wiele czystsze pod względem odzyskiwania reprezentacji String z skrótu 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));
    }
}

Kod został wyciągnięty stąd .

Heshan Perera
źródło
2
Dlaczego ta odpowiedź -1, podczas gdy druga, krótsza i mniej opisowa odpowiedź ma +146?
Nilzor
4
Fajnie jest używać BigInteger, aby uzyskać wartość heksadecymalną +1
Dave.B
5
Właśnie dowiedziałem się, że w niektórych przypadkach generuje to tylko 31 znaków MD5 o długości, a nie 32, jak powinno być
kovica
3
@kovica to dlatego, że początkowe zera zostają obcięte, jeśli dobrze pamiętam. String.format("%032x", new BigInteger(1, hash)); To powinno rozwiązać ten problem. „hash” jest bajtem [] hash.
Heshan Perera
Ta odpowiedź zawiera błąd związany z typem zestawu znaków!
Dawid Drozd
31

Inną opcją jest użycie metod mieszania guawy :

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

Przydatne, jeśli już używasz Guawy (a jeśli nie, prawdopodobnie powinieneś).

andrewrjones
źródło
3
lub przy użyciu jednej z metod skrótów:Hashing.md5().hashString("my string").asBytes();
Kurt Alfred Kluever
4
@KurtAlfredKluever nie zapomnij wstawić zestawu znaków, takiego jak „Hashing.md5 (). HashString („ mój ciąg ”, Charsets.UTF_8) .asBytes ()”
Justin
31

Kolejne wdrożenie:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
układacz
źródło
2
Widziałem tylko jeden wiersz, który nie korzysta z zewnętrznej biblioteki.
holmis83,
O ile się nie mylę, to zawsze zwraca wielkie litery, które nie będą się zgadzały z md5 wykonanymi bez użycia heksa. Nie jestem nawet pewien, czy to prawdziwy md5
walshie4,
2
@ walshie4 nie ma MD5 bez heksa (patrz ietf.org/rfc/rfc1321.txt ), aby uzyskać małe litery wystarczy dodać .toLower (). Porównaj wyniki z przykładami np. En.wikipedia.org/wiki/MD5, wtedy będziesz mieć większą szansę, aby uwierzyć, że kod biblioteki JavaScript jest poprawny.
układarka
28

Mam Class (Hash) do konwersji zwykłego tekstu w skrócie w formatach: md5 lub sha1, simillar, który działa w 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");
    }
}

Testowanie z JUnit i PHP

Skrypt PHP:

<?php

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

Wyjściowy skrypt PHP:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Przy użyciu przykładu i testowania z JUnit:

    public class HashTest {

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

}

Kod w GitHub

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

fitorec
źródło
Jak powiedział @CedricSimon, właśnie tego szukałem. Głosuj tutaj .. Dzięki!
Joabe Lucena
24

Nie trzeba tego komplikować.
DigestUtils działa dobrze i zapewnia wygodę podczas pracy z md5hashami.

DigestUtils.md5Hex(_hash);

lub

DigestUtils.md5(_hash);

Możesz użyć dowolnej innej metody szyfrowania, takiej jak shalub md.

Fatih Karatana
źródło
22

Moja niezbyt odkrywcza odpowiedź:

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;
}
marioosh
źródło
i String.format("%1$032X", big)mieć format wielkich liter
alex
17

Możesz spróbować śledzić. Zobacz szczegóły i pobierz kody tutaj: 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();
}
}
ylu
źródło
16

Odpowiedź Bombe jest poprawna, jednak zauważ, że o ile nie musisz bezwzględnie korzystać z MD5 (np. Zmuszonego do współpracy), lepszym wyborem jest SHA1, ponieważ MD5 ma słabości do długotrwałego użytkowania.

Powinienem dodać, że SHA1 ma również luki teoretyczne, ale nie tak poważne. Obecny stan techniki w dziedzinie mieszania polega na tym, że istnieje wiele kandydujących funkcji mieszających zastępujących, ale żadna z nich nie stała się jeszcze standardową najlepszą praktyką zastępującą SHA1. Tak więc, w zależności od potrzeb, dobrze jest skonfigurować algorytm skrótu, aby można go było zmienić w przyszłości.

frankodwyer
źródło
Czy możesz wskazać mi zasoby, w których mogę przeczytać o względnych zaletach i słabościach każdego z nich?
Akshay
Prawdopodobnie najlepsze, co możesz teraz zrobić, to użyć SHA1 i być gotowym do zastąpienia go w przyszłości. Możesz użyć nowszych funkcji, ale nie były one jeszcze przedmiotem wielu badań. Możesz śledzić zasoby bezpieczeństwa online, aby dowiedzieć się, kiedy to się zmienia - na przykład blog Bruce'a Schneiera.
frankodwyer
7
SHA1 to przesada, chyba że potrzebujesz kryptograficznie bezpiecznego skrótu, tzn. Nie chcesz, aby skrót pomógł w odtworzeniu oryginalnej wiadomości, ani nie chcesz, aby sprytny napastnik utworzył inną wiadomość, która pasuje do skrótu. Jeśli oryginał nie jest tajemnicą, a skrót nie jest używany do bezpieczeństwa, MD5 jest szybki i łatwy. Na przykład Google Web Toolkit używa skrótów MD5 w adresach URL JavaScript (np. Foo.js? Hash = 12345).
David Leppik,
12

Kolejna implementacja: szybka implementacja MD5 w Javie

String hash = MD5.asHex(MD5.getHash(new File(filename)));
Łukasz R.
źródło
1
Jest to solidna, samodzielna biblioteka z minimalnymi zależnościami. Dobry towar.
Ajax
Uważam to za bardzo przydatne. Plik 4,57 GB zajął 15357 ms, natomiast implementacja wbudowana Java zajęła 19094 ms.
bkrish
11

Nie wiem, czy jest to istotne dla każdego, kto to czyta, ale właśnie miałem problem, który chciałem

  • pobierz plik z podanego adresu URL i
  • porównaj jego MD5 ze znaną wartością.

Chciałem to zrobić tylko z klasami JRE (bez Apache Commons lub podobnego). Szybkie wyszukiwanie w Internecie nie pokazało mi fragmentów przykładowego kodu wykonujących oba jednocześnie, tylko każde zadanie osobno. Ponieważ wymaga to dwukrotnego przeczytania tego samego pliku, pomyślałem, że warto poświęcić chwilę na napisanie kodu, który ujednolica oba zadania, obliczając sumę kontrolną w locie podczas pobierania pliku. Oto mój wynik (przepraszam, jeśli nie jest to idealna Java, ale myślę, że i tak rozumiesz):

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)
        );
}
kriegaex
źródło
1
Och, BTW, zanim ktokolwiek, oprócz mnie, zauważy, jak zła jest moja znajomość JRE: właśnie odkryłem DigestInputStream i DigestOutputStream . Zamierzam edytować moje oryginalne rozwiązanie, aby odzwierciedlić to, czego się właśnie nauczyłem.
kriegaex
6

Spójrz na następujący link, w przykładzie otrzymano skrót MD5 dostarczonego obrazu: skrót MD5 obrazu


źródło
6

Na ile warto, natknąłem się na to, ponieważ chcę zsyntetyzować identyfikatory GUID z naturalnego klucza dla programu, który zainstaluje komponenty COM; Chcę syhthesize, aby nie zarządzać cyklem życia GUID. Użyję MD5, a następnie klasy UUID, aby uzyskać z niego ciąg znaków. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 podnosi ten problem).

W każdym razie java.util.UUID może uzyskać ładny ciąg z bajtów MD5.

return UUID.nameUUIDFromBytes(md5Bytes).toString();
Mihai Danila
źródło
w rzeczywistości akceptuje nie tylko tablicę bajtów MD5 (rozmiar == 16). Możesz przekazać tablicę bajtów o dowolnej długości. Zostanie przekonwertowany na tablicę bajtów MD5 za pomocą MD5 MessageDigest(patrz kod źródłowy nameUUIDFromBytes () )
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();
Giancarlo Romeo
źródło
6

W przeciwieństwie do PHP, w którym można zrobić skrót MD5 tekstu, po prostu wywołując funkcję md5, tj. md5($text)W Javie było to trochę skomplikowane. Zwykle implementowałem go, wywołując funkcję, która zwraca tekst skrótu md5. Oto jak to zaimplementowałem. Najpierw utwórz funkcję o nazwie md5hashingwewnątrz głównej klasy, jak podano poniżej.

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

Teraz wywoływaj funkcję, ilekroć potrzebujesz, jak podano poniżej.

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

Tutaj możesz zobaczyć, że hashtext jest dołączony do zera, aby dopasować go do haszowania md5 w PHP.

Geordy James
źródło
5

MD5 jest całkowicie w porządku, jeśli nie potrzebujesz najlepszego bezpieczeństwa, a jeśli robisz coś takiego, jak sprawdzanie integralności pliku, bezpieczeństwo nie jest brane pod uwagę. W takim przypadku możesz rozważyć coś prostszego i szybszego, na przykład Adler32, który jest również obsługiwany przez biblioteki Java.


źródło
2
Co sprawia, że ​​uważasz, że integralność pliku nie jest problemem bezpieczeństwa?
Jeremy Huiskamp
5

ten daje dokładny md5, jaki otrzymujesz z funkcji md5 mysql lub funkcji md5 php itp. To jest to, którego używam (możesz zmienić zgodnie z własnymi potrzebami)

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

}
Aurangzeb
źródło
4

Spróbuj tego:

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 "";
    }
}
Marcelo Lopes
źródło
2
Jest to prawdopodobnie najgorsze rozwiązanie, ponieważ usuwa wiodące zera.
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)
HimalayanCoder
źródło
1
Czy to język Kotlin?
Isuru
3
@Isuru wygląda jak Scala
gildor
4

Możesz wygenerować skrót MD5 dla danego tekstu, korzystając z metod w MessageDigestklasie w java.securitypakiecie. Poniżej znajduje się pełny fragment kodu,

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

Dane wyjściowe z funkcji MD5 to 128-bitowy skrót reprezentowany przez 32 liczby szesnastkowe.

Jeśli używasz bazy danych takiej jak MySQL, możesz to zrobić również w prostszy sposób. Zapytanie Select MD5(“text here”)zwróci skrót MD5 tekstu w nawiasie.

Prasanna LM
źródło
2

Oto po co tu przyszedłem - przydatna funkcja scala, która zwraca ciąg skrótu MD5:

def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}
Priyank Desai
źródło
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));
 }
}

Na ten temat znajduje się artykuł na temat Codingkit. Sprawdź: http://codingkit.com/a/JAVA/2013/1020/2216.html

shouyu
źródło