Bagaimana saya bisa menghasilkan hash MD5?


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.


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.


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

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.


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


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 .


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.


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

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 .


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


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

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


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.


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

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

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.


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

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

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


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

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

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.


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.


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

}

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

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)

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.


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(""){_ + _}

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.