Apakah ada metode untuk menghasilkan hash MD5 dari string di Jawa?
Apakah ada metode untuk menghasilkan hash MD5 dari string di Jawa?
Jawaban:
Kamu butuh java.security.MessageDigest
.
Panggil MessageDigest.getInstance("MD5")
untuk mendapatkan instance MD5 yang MessageDigest
dapat Anda gunakan.
Hitung hash dengan melakukan salah satu dari:
byte[]
dan hitung hash dalam satu operasi dengan md.digest(bytes)
.MessageDigest
satu 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.
MessageDigest
memungkinkan 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.
The MessageDigest
kelas 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.
yourString.getBytes(StandardCharsets.UTF_8)
. Ini mencegah penanganan UnsupportedEncodingException
.
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;
}
hashtext = "0".repeat(32 - hashtext.length()) + hashtext
alih-alih while
, sehingga editor tidak akan memberi Anda peringatan bahwa Anda melakukan penggabungan string di dalam satu lingkaran.
Anda mungkin juga ingin melihat kelas DigestUtils dari proyek codec apache commons , yang menyediakan metode yang sangat nyaman untuk membuat MD5 atau SHA dicest.
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
getBytes()
, jika tidak, kode Anda akan mendapatkan hasil yang berbeda pada platform / pengaturan pengguna yang berbeda.
byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
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.Hex
dari proyek Apache Commons .
String result = Hex.encodeHexString(resultByte);
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.
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()));
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 .
String.format("%032x", new BigInteger(1, hash));
Ini harus menyelesaikan ini. 'hash' adalah byte [] dari hash.
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).
Hashing.md5().hashString("my string").asBytes();
Implementasi lain:
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
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");
}
}
<?php
echo 'MD5 :' . md5('Hello World') . "\n";
echo 'SHA1:' . sha1('Hello World') . "\n";
MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0
public class HashTest {
@Test
public void test() {
String txt = "Hello World";
assertEquals("b10a8db164e0754105b7a99be72e3fe5", Hash.md5(txt));
assertEquals("0a4d55a8d778e5022fab701977c5d840bbc486d0", Hash.sha1(txt));
}
}
Tidak perlu membuatnya terlalu rumit.
DigestUtils berfungsi dengan baik dan membuat Anda nyaman saat bekerja dengan md5
hash.
DigestUtils.md5Hex(_hash);
atau
DigestUtils.md5(_hash);
Anda dapat menggunakan metode enkripsi lain seperti sha
atau md
.
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;
}
String.format("%1$032X", big)
memiliki format huruf besar
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();
}
}
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.
Implementasi lain: Implementasi MD5 Cepat di Jawa
String hash = MD5.asHex(MD5.getHash(new File(filename)));
Saya tidak tahu apakah ini relevan bagi siapa pun yang membaca ini, tetapi saya hanya memiliki masalah yang saya inginkan
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)
);
}
Lihatlah tautan berikut, Contoh mendapat Hash MD5 dari gambar yang disediakan: Hash MD5 dari Gambar
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();
MessageDigest
(lihat nameUUIDFromBytes () kode sumber )
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();
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 md5hashing
di 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.
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.
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;
}
}
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 "";
}
}
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)
Anda dapat menghasilkan hash MD5 untuk teks yang diberikan dengan memanfaatkan metode di MessageDigest
kelas dalam java.security
paket. 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.
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(""){_ + _}
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