Bagaimana saya bisa menghasilkan hash MD5?

1007

Apakah ada metode untuk menghasilkan hash MD5 dari string di Jawa?

Akshay
sumber
40
MD5 mungkin tidak aman sebagai fitur keamanan satu arah, tetapi masih bagus untuk aplikasi checksum umum.
rustyx
Anda dapat mencoba di php, sangat mudah diselesaikan.
Anupam Haldkar

Jawaban:

602

Kamu butuh java.security.MessageDigest.

Panggil MessageDigest.getInstance("MD5")untuk mendapatkan instance MD5 yang MessageDigestdapat Anda gunakan.

Hitung hash dengan melakukan salah satu dari:

  • Feed seluruh input sebagai byte[]dan hitung hash dalam satu operasi dengan md.digest(bytes).
  • Beri makan MessageDigestsatu byte[]potong sekaligus dengan menelepon md.update(bytes). Setelah selesai menambahkan byte input, hitung hash dengan md.digest().

Yang byte[]dikembalikan md.digest()adalah hash MD5.

Bombe
sumber
144
Satu hal yang tidak disebutkan di sini, dan mengejutkan saya. Kelas MessageDigest TIDAK aman untuk thread. Jika mereka akan digunakan oleh utas yang berbeda, buat saja yang baru, alih-alih mencoba menggunakannya kembali.
mjuarez
39
Ini menggunakan beberapa metode untuk mengubah keadaan internalnya. Bagaimana tidak adanya pengaman benang bisa mengejutkan sama sekali?
Bombe
90
@Bombe: mengapa kita berharap harus tahu tentang keadaan internal MessageDigest?
Dan Barowy
28
@DanBarowy baik, Anda yang bermutasi itu (yaitu memanggil metode yang tidak mengembalikan nilai-nilai tetapi menyebabkan metode lain untuk kembali nilai-nilai yang berbeda) sehingga sampai terbukti sebaliknya Anda harus selalu berasumsi bahwa itu tidak thread-aman untuk melakukannya.
Bombe
3
@Traubenfuchs MessageDigestmemungkinkan Anda untuk memasukkan data dalam potongan-potongan. Itu tidak mungkin dengan metode statis. Meskipun Anda dapat berdebat, mereka seharusnya menambahkan satu untuk kenyamanan ketika Anda dapat melewatkan semua data sekaligus.
user253751
690

The MessageDigestkelas dapat menyediakan Anda dengan sebuah instance dari MD5 digest.

Ketika bekerja dengan string dan kelas crypto pastikan untuk selalu menentukan pengkodean yang Anda inginkan representasi byte. Jika Anda hanya menggunakannya string.getBytes()akan menggunakan platform default. (Tidak semua platform menggunakan standar yang sama)

import java.security.*;

..

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

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

Jika Anda memiliki banyak data, lihat .update(byte[])metode yang dapat dipanggil berulang kali. Kemudian panggil .digest()untuk mendapatkan hash yang dihasilkan.

koregan
sumber
“LATIN1”! = “ASCII” (atau “US-ASCII”). ASCII adalah set karakter 7-bit, Latin1 adalah set karakter 8-bit. Mereka tidak sama.
Bombe
8
(lihat joelonsoftware.com/articles/Unicode.html untuk alasan dan penjelasan yang jauh lebih baik)
Piskvor meninggalkan gedung
14
Topik ini juga berguna jika Anda perlu mengubah byte yang dihasilkan menjadi string hex.
weekens
1
Lalu bagaimana cara Anda mengonversikan sampel ini ke sebuah string sehingga kita bisa memasukkannya ke dalam mysql?
Humphrey
2
Lebih baik lagi jika memungkinkan yourString.getBytes(StandardCharsets.UTF_8). Ini mencegah penanganan UnsupportedEncodingException.
Hummeling Engineering BV
267

Jika Anda benar-benar menginginkan jawaban kembali sebagai string sebagai lawan dari array byte, Anda selalu dapat melakukan sesuatu seperti ini:

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;
}
pengguna49913
sumber
12
@ BalusC: Tidak benar, metode BigInteger.toString akan mengembalikan angka penuh dalam basis yang ditentukan. 0x0606 akan dicetak sebagai 606, hanya nol yang tertinggal dihilangkan,
Spidey
11
Nitpick kecil: m.reset () tidak diperlukan segera setelah memanggil getInstance. Lebih kecil: 'teks Anda di sini' membutuhkan tanda kutip ganda.
David Leppik
Dari Java 11 dan seterusnya , Anda dapat menggunakan hashtext = "0".repeat(32 - hashtext.length()) + hashtextalih-alih while, sehingga editor tidak akan memberi Anda peringatan bahwa Anda melakukan penggabungan string di dalam satu lingkaran.
tom
Alih-alih m.update (plaintext.getBytes ()); Saya akan merekomendasikan menentukan encoding. seperti m.update (plaintext.getBytes ("UTF-8")); getBytes () tidak menjamin pengkodean dan dapat bervariasi dari satu sistem ke sistem lainnya yang dapat menghasilkan hasil MD5 berbeda antara sistem untuk String yang sama.
user1819780
256

Anda mungkin juga ingin melihat kelas DigestUtils dari proyek codec apache commons , yang menyediakan metode yang sangat nyaman untuk membuat MD5 atau SHA dicest.

Lutzh
sumber
2
Secara khusus, metode-metode yang mengembalikan representasi yang dikodekan "aman" dari data byte dalam bentuk string.
Rob
4
Namun tidak ada cara mudah untuk memasukkan kelas DigestUtils ke proyek Anda tanpa menambahkan satu ton lib, atau memindahkan kelas "per tangan" yang membutuhkan setidaknya dua kelas lagi.
iuiz
Tidak dapat menemukannya di repo pakar. Grrrr.
sparkyspider
5
Seharusnya berada di repositori Maven pusat, kecuali saya menjadi gila: groupId = commons-codec artifactId = commons-codec versi = 1.5
Nick Spacek
160

Menemukan ini:

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

di situs di bawah ini, saya tidak mengambil kredit untuk itu, tetapi ini adalah solusi yang berfungsi! Bagi saya banyak kode lain tidak berfungsi dengan baik, saya akhirnya hilang 0s di hash. Yang ini tampaknya sama dengan PHP. sumber: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093

dac2009
sumber
15
Anda harus menentukan pengkodean untuk digunakan getBytes(), jika tidak, kode Anda akan mendapatkan hasil yang berbeda pada platform / pengaturan pengguna yang berbeda.
Paŭlo Ebermann
@ PaŭloEbermann melakukan MessageDigest.getInstance ("MD5"); tidak cukup? Saya mencoba untuk menambahkan "MD5" di getBytes () tetapi ia mengembalikan kesalahan
Blaze Tama
2
@BlazeTama "MD5" bukan penyandian, itu adalah algoritma intisari pesan (dan bukan yang harus digunakan dalam aplikasi baru). Pengkodean adalah pasangan algoritma yang mengubah byte ke string dan string ke byte. Contohnya adalah "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE", dan sejenisnya. Gunakan pengkodean yang sama seperti setiap pihak lain yang menghitung hash dari string ini, jika tidak, Anda akan mendapatkan hasil yang berbeda.
Paŭlo Ebermann
6
Sebagai contoh set karakter ... (gunakan UTF-8, itu yang terbaik dan paling kompatibel menurut saya) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
Richard
Karena ini bukan solusi saya, dan saya tidak menguji semua skenario sendiri, saya akan membiarkannya tidak berubah, meskipun saya pikir menentukan pengkodean dll mungkin adalah ide yang baik.
dac2009
88

Inilah cara saya menggunakannya:

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

di mana Hex berada: org.apache.commons.codec.binary.Hexdari proyek Apache Commons .

adranale
sumber
14
Jika Anda tetap menggunakan Apache Commons Codec, Anda dapat menggunakan: commons.apache.org/codec/api-release/org/apache/commons/codec/…
squiddle
13
Saya akan mengganti baris terakhir dengan ini:String result = Hex.encodeHexString(resultByte);
kebiru
84

Saya baru saja mengunduh commons-codec.jar dan mendapatkan php sempurna seperti md5. Ini manual .

Impor saja ke proyek Anda dan gunakan

String Url = "your_url";

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

dan begitulah.

Eugene
sumber
1
Ini adalah metode yang memberikan nilai pengembalian yang sama dengan fungsi MySQL md5 (str). Banyak jawaban lain memang mengembalikan nilai lain.
rwitzel
1
Ini tidak berfungsi dengan baik di Android karena Android bundles commons-codec 1.2, yang Anda perlukan solusinya: stackoverflow.com/a/9284092/2413303
EpicPandaForce
76

Saya menemukan ini sebagai cara yang paling jelas dan ringkas untuk melakukannya:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
rednoah
sumber
3
Bagus. Itu tidak jatuh ke dalam perangkap memotong nol terkemuka.
Markus Pscheidt
2
Hati-hati ini tidak akan berfungsi untuk Android jika Anda menggunakan API level <19, tetapi Anda hanya perlu mengubah baris kedua dengan md5.update (string.getBytes ("UTF-8")); Ini akan menambah satu lagi pengecualian yang diperiksa untuk ditangani, ...
Fran Marzoa
34

Menemukan solusi yang jauh lebih bersih dalam hal mendapatkan representasi String kembali dari hash 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));
    }
}

Kode diekstraksi dari sini .

Heshan Perera
sumber
2
Mengapa jawaban ini -1 sedangkan jawaban lainnya, lebih pendek dan kurang deskriptif +146?
Nilzor
4
Senang menggunakan BigInteger untuk mendapatkan nilai hex +1
Dave.B
5
Saya baru tahu bahwa dalam beberapa kasus ini hanya menghasilkan 31 karakter panjang MD5, bukan 32 sebagaimana mestinya
kovica
3
@ Kovica ini karena, nol awal akan terpotong jika saya ingat benar .. String.format("%032x", new BigInteger(1, hash)); Ini harus menyelesaikan ini. 'hash' adalah byte [] dari hash.
Heshan Perera
Jawaban ini memiliki bug dengan tipe charset!
Dawid Drozd
31

Pilihan lain adalah menggunakan metode Hashing Guava :

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

Berguna jika Anda sudah menggunakan Jambu Biji (yang jika tidak, Anda mungkin harus).

andrewrjones
sumber
3
atau menggunakan salah satu metode pintas:Hashing.md5().hashString("my string").asBytes();
Kurt Alfred Kluever
4
@KurtAlfredKluever jangan lupa untuk memasukkan charset seperti 'Hashing.md5 (). HashString ("my string", Charsets.UTF_8) .asBytes ()'
Justin
31

Implementasi lain:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
stacker
sumber
2
Hanya satu liner yang saya lihat yang tidak menggunakan perpustakaan eksternal.
holmis83
Kecuali saya salah ini akan selalu kembali dalam huruf besar yang tidak akan sejajar dengan md5 yang dibuat tanpa menggunakan hex. Bahkan tidak yakin itu benar-benar md5
walshie4
2
@ walshie4 tidak ada MD5 tanpa hex (lihat ietf.org/rfc/rfc1321.txt ), untuk mendapatkannya dalam huruf kecil cukup tambahkan .toLower (). Bandingkan hasilnya dengan contoh-contoh di misalnya en.wikipedia.org/wiki/MD5 maka Anda akan memiliki kesempatan yang lebih baik untuk percaya bahwa kode perpustakaan Javas benar.
stacker
28

Saya memiliki Kelas (Hash) untuk mengonversi teks biasa dalam hash dalam format: md5 atau sha1, simillar fungsi-fungsi 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");
    }
}

Pengujian dengan JUnit dan PHP

Script PHP:

<?php

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

Keluaran skrip PHP:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

Menggunakan contoh dan Pengujian dengan JUnit:

    public class HashTest {

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

}

Kode di GitHub

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

fitorec
sumber
Seperti yang dikatakan @CedricSimon, itulah yang saya cari. Suara positif di sini .. Terima kasih!
Joabe Lucena
24

Tidak perlu membuatnya terlalu rumit.
DigestUtils berfungsi dengan baik dan membuat Anda nyaman saat bekerja dengan md5hash.

DigestUtils.md5Hex(_hash);

atau

DigestUtils.md5(_hash);

Anda dapat menggunakan metode enkripsi lain seperti shaatau md.

Fatih Karatana
sumber
22

Jawaban saya yang tidak terlalu terbuka:

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
sumber
dan String.format("%1$032X", big)memiliki format huruf besar
alex
17

Anda dapat mencoba mengikuti. Lihat detail dan unduh kode di sini: 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
sumber
16

Jawaban Bombe benar, namun perhatikan bahwa kecuali Anda benar-benar harus menggunakan MD5 (mis. Dipaksakan pada Anda untuk interoperabilitas), pilihan yang lebih baik adalah SHA1 karena MD5 memiliki kelemahan untuk penggunaan jangka panjang.

Saya harus menambahkan bahwa SHA1 juga memiliki kelemahan teoretis, tetapi tidak separah itu. Keadaan canggih saat ini dalam hashing adalah bahwa ada sejumlah fungsi hash penggantian kandidat tetapi belum ada yang muncul sebagai praktik terbaik standar untuk menggantikan SHA1. Jadi, tergantung pada kebutuhan Anda, Anda akan disarankan untuk membuat algoritma hash Anda dapat dikonfigurasi sehingga dapat diganti di masa depan.

frankodwyer
sumber
Bisakah Anda mengarahkan saya ke beberapa sumber, di mana saya bisa membaca tentang kelebihan dan kelemahan masing-masing?
Akshay
Mungkin yang terbaik yang dapat Anda lakukan saat ini adalah menggunakan SHA1 dan siap untuk menggantinya di masa depan. Anda dapat menggunakan fungsi-fungsi yang lebih baru tetapi mereka belum mengalami banyak penelitian. Anda dapat melacak sumber daya keamanan online untuk mengetahui kapan ini berubah - misalnya blog Bruce Schneier.
frankodwyer
7
SHA1 berlebihan kecuali jika Anda menginginkan hash yang aman secara kriptografis, yaitu Anda tidak ingin hash membantu dalam merekonstruksi pesan asli, Anda juga tidak ingin penyerang yang pandai untuk membuat pesan lain yang cocok dengan hash. Jika aslinya bukan rahasia dan hash tidak digunakan untuk keamanan, MD5 cepat dan mudah. Misalnya, Google Web Toolkit menggunakan hash MD5 dalam URL JavaScript (mis. Foo.js? Hash = 12345).
David Leppik
12

Implementasi lain: Implementasi MD5 Cepat di Jawa

String hash = MD5.asHex(MD5.getHash(new File(filename)));
Lukasz R.
sumber
1
Ini adalah perpustakaan yang solid dan mandiri dengan ketergantungan minimal. Barang bagus.
Ajax
Saya merasa sangat berguna. Butuh 15357 ms untuk file 4,57GB sedangkan implementasi inbuilt java butuh 19094 ms.
bkrish
11

Saya tidak tahu apakah ini relevan bagi siapa pun yang membaca ini, tetapi saya hanya memiliki masalah yang saya inginkan

  • unduh file dari URL yang diberikan dan
  • bandingkan MD5-nya dengan nilai yang diketahui.

Saya ingin melakukannya dengan kelas JRE saja (tanpa Apache Commons atau yang serupa). Pencarian web cepat tidak menunjukkan kepada saya cuplikan kode sampel melakukan keduanya pada saat yang sama, hanya setiap tugas secara terpisah. Karena ini mengharuskan untuk membaca file yang sama dua kali, saya pikir mungkin ada baiknya untuk menulis beberapa kode yang menyatukan kedua tugas, menghitung checksum dengan cepat saat mengunduh file. Ini adalah hasil saya (maaf jika itu bukan Java yang sempurna, tapi saya kira Anda tetap mendapatkan idenya):

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
sumber
1
Oh BTW, sebelum orang lain kecuali saya sendiri menyadari betapa buruknya pengetahuan JRE saya: Saya baru saja menemukan DigestInputStream dan DigestOutputStream . Saya akan mengedit solusi asli saya untuk mencerminkan apa yang baru saja saya pelajari.
kriegaex
6

Lihatlah tautan berikut, Contoh mendapat Hash MD5 dari gambar yang disediakan: Hash MD5 dari Gambar


sumber
6

Untuk apa nilainya, saya menemukan ini karena saya ingin mensintesis GUID dari kunci alami untuk program yang akan menginstal komponen COM; Saya ingin mengubah ukuran agar tidak mengelola siklus hidup GUID. Saya akan menggunakan MD5 dan kemudian menggunakan kelas UUID untuk mendapatkan string dari itu. (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 memunculkan masalah ini).

Bagaimanapun, java.util.UUID dapat memberi Anda String yang bagus dari byte MD5.

return UUID.nameUUIDFromBytes(md5Bytes).toString();
Mihai Danila
sumber
sebenarnya ia menerima tidak hanya array byte MD5 (ukuran == 16). Anda dapat melewatkan array byte dengan panjang berapa pun. Ini akan dikonversikan ke MD5 bytes array dengan menggunakan MD5 MessageDigest(lihat nameUUIDFromBytes () kode sumber )
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
sumber
6

Tidak seperti PHP di mana Anda dapat melakukan hashing MD5 teks Anda dengan hanya memanggil fungsi md5 yaitu md5($text), di Jawa itu dibuat sedikit rumit. Saya biasanya menerapkannya dengan memanggil fungsi yang mengembalikan teks hash md5. Inilah cara saya mengimplementasikannya, Pertama buat fungsi bernama md5hashingdi dalam kelas utama Anda seperti yang diberikan di bawah ini.

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

Sekarang panggil fungsi tersebut kapan pun Anda butuhkan seperti yang diberikan di bawah ini.

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

Di sini Anda dapat melihat bahwa hashtext ditambahkan dengan nol untuk membuatnya cocok dengan hashing md5 di PHP.

Geordy James
sumber
5

MD5 baik-baik saja jika Anda tidak memerlukan keamanan terbaik, dan jika Anda melakukan sesuatu seperti memeriksa integritas file maka keamanan bukanlah pertimbangan. Dalam kasus seperti itu Anda mungkin ingin mempertimbangkan sesuatu yang lebih sederhana dan lebih cepat, seperti Adler32, yang juga didukung oleh perpustakaan Java.


sumber
2
Apa yang membuat Anda berpikir integritas file bukan masalah keamanan?
Jeremy Huiskamp
5

yang ini memberikan md5 persis seperti yang Anda dapatkan dari fungsi md5 mysql atau fungsi md5 php dll. Ini adalah yang saya gunakan (Anda dapat mengubah sesuai dengan kebutuhan Anda)

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

coba ini:

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
sumber
2
Ini mungkin solusi terburuk karena menghilangkan nol di depan.
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
sumber
1
Apakah ini bahasa Kotlin?
Isuru
3
@ Isuru terlihat seperti Scala
gildor
4

Anda dapat menghasilkan hash MD5 untuk teks yang diberikan dengan memanfaatkan metode di MessageDigestkelas dalam java.securitypaket. Di bawah ini adalah cuplikan kode lengkap,

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

Output dari fungsi MD5 adalah hash 128 bit yang diwakili oleh 32 angka heksadesimal.

Jika Anda menggunakan database seperti MySQL, Anda dapat melakukannya dengan cara yang lebih sederhana. Kueri Select MD5(“text here”)akan mengembalikan hash MD5 teks di braket.

Prasanna LM
sumber
2

Inilah yang saya datang ke sini untuk- fungsi scala yang berguna yang mengembalikan string hash MD5:

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

Ada sebuah artikel tentang Codingkit tentang itu. Lihat: http://codingkit.com/a/JAVA/2013/1020/2216.html

shouyu
sumber