มีวิธีใดในการสร้าง MD5 hash ของสตริงใน Java?
มีวิธีใดในการสร้าง MD5 hash ของสตริงใน Java?
คำตอบ:
java.security.MessageDigest
คุณจำเป็นต้อง
โทรMessageDigest.getInstance("MD5")
เพื่อรับอินสแตนซ์ MD5 ของMessageDigest
คุณสามารถใช้ได้
คำนวณแฮชโดยทำหนึ่งใน:
byte[]
และคำนวณแฮชในหนึ่งการดำเนินการด้วยmd.digest(bytes)
และคำนวณกัญชาในการดำเนินการกับMessageDigest
หนึ่งอันในเวลาโดยการเรียกbyte[]
เมื่อคุณทำเสร็จเพิ่มไบต์การป้อนข้อมูลการคำนวณกัญชาด้วยmd.update(bytes)
md.digest()
byte[]
กลับโดยmd.digest()
เป็นกัญชา MD5
MessageDigest
ให้คุณป้อนข้อมูลเป็นกลุ่ม ที่เป็นไปไม่ได้ด้วยวิธีการคงที่ แม้ว่าคุณจะสามารถโต้แย้งได้ว่าพวกเขาควรจะเพิ่มหนึ่งเพื่อความสะดวกเมื่อคุณสามารถส่งข้อมูลทั้งหมดในครั้งเดียว
MessageDigest
ระดับสามารถให้คุณมีตัวอย่างของ MD5 ย่อย
เมื่อทำงานร่วมกับสตริงและเรียนการเข้ารหัสลับให้แน่ใจว่าจะเสมอระบุการเข้ารหัสที่คุณต้องการเป็นตัวแทนไบต์ใน. หากคุณเพียงแค่ใช้string.getBytes()
มันจะใช้ค่าเริ่มต้นแพลตฟอร์ม (ไม่ใช่ทุกแพลตฟอร์มที่ใช้ค่าเริ่มต้นเดียวกัน)
import java.security.*;
..
byte[] bytesOfMessage = yourString.getBytes("UTF-8");
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] thedigest = md.digest(bytesOfMessage);
หากคุณมีข้อมูลจำนวนมากลองดู.update(byte[])
วิธีการที่สามารถเรียกซ้ำ ๆ ได้ จากนั้นโทร.digest()
เพื่อรับแฮชที่ได้
yourString.getBytes(StandardCharsets.UTF_8)
ยังดีกว่าที่ใช้เป็นไปได้ UnsupportedEncodingException
จัดการป้องกันไม่ให้นี้
หากคุณต้องการคำตอบกลับเป็นสตริงแทนที่จะเป็นอาร์เรย์ไบต์คุณสามารถทำสิ่งนี้ได้เสมอ:
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
แทนwhile
ดังนั้นผู้แก้ไขจะไม่เตือนคุณว่าคุณกำลังเชื่อมต่อสตริงภายในลูป
คุณอาจต้องการดูคลาสDigestUtilsของ apache commons codec project ซึ่งให้วิธีการที่สะดวกมากในการสร้าง MD5 หรือ SHA digests
พบสิ่งนี้:
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;
}
บนเว็บไซต์ด้านล่างฉันไม่ได้รับเครดิต แต่เป็นวิธีแก้ปัญหาที่ใช้งานได้! สำหรับฉันรหัสอื่น ๆ จำนวนมากทำงานไม่ถูกต้องฉันลงเอยด้วยการขาด 0s ในแฮช อันนี้ดูเหมือนจะเหมือนกับ PHP ที่มีอยู่ แหล่งที่มา: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093
getBytes()
มิฉะนั้นรหัสของคุณจะได้รับผลลัพธ์ที่แตกต่างกันในการตั้งค่าแพลตฟอร์ม / ผู้ใช้ที่แตกต่างกัน
byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
นี่คือวิธีที่ฉันใช้:
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));
ที่ซวยคือorg.apache.commons.codec.binary.Hex
จากโครงการ Apache คอมมอนส์
String result = Hex.encodeHexString(resultByte);
ฉันเพิ่งดาวน์โหลดcommons-codec.jarและได้ php ที่สมบูรณ์แบบเช่น md5 นี่คือคู่มือ
เพียงนำเข้าสู่โครงการของคุณและใช้
String Url = "your_url";
System.out.println( DigestUtils.md5Hex( Url ) );
และที่นั่นคุณมีมัน
ฉันพบสิ่งนี้เป็นวิธีที่ชัดเจนและรัดกุมที่สุดในการทำ:
MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));
พบโซลูชันนี้ซึ่งมีความสะอาดกว่ามากในแง่ของการได้รับการแสดง String กลับจากแฮช MD5
import java.security.*;
import java.math.*;
public class MD5 {
public static void main(String args[]) throws Exception{
String s="This is a test";
MessageDigest m=MessageDigest.getInstance("MD5");
m.update(s.getBytes(),0,s.length());
System.out.println("MD5: "+new BigInteger(1,m.digest()).toString(16));
}
}
String.format("%032x", new BigInteger(1, hash));
นี่ควรแก้ปัญหานี้ 'hash' เป็นไบต์ [] ของ hash
ตัวเลือกอื่นคือการใช้วิธีการล้างข้อมูลของ Guava :
Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();
มีประโยชน์ถ้าคุณใช้ Guava อยู่แล้ว (ซึ่งถ้าคุณไม่ใช่คุณก็ควรจะเป็น)
Hashing.md5().hashString("my string").asBytes();
การใช้งานอื่น:
import javax.xml.bind.DatatypeConverter;
String hash = DatatypeConverter.printHexBinary(
MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));
ฉันมีคลาส (แฮช) เพื่อแปลงข้อความธรรมดาเป็นแฮชในรูปแบบ: md5 หรือ sha1, simillar ที่ฟังก์ชัน 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));
}
}
ไม่จำเป็นต้องทำให้ซับซ้อนเกินไป
DigestUtilsทำงานได้ดีและทำให้คุณรู้สึกสะดวกสบายขณะทำงานกับmd5
แฮช
DigestUtils.md5Hex(_hash);
หรือ
DigestUtils.md5(_hash);
ไม่ว่าคุณจะสามารถใช้วิธีการเข้ารหัสอื่น ๆ เช่นหรือsha
md
คำตอบที่ไม่ค่อยเปิดเผยของฉัน:
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)
มีรูปแบบตัวพิมพ์ใหญ่
มีDigestUtils
ชั้นเรียนในฤดูใบไม้ผลิด้วย:
ชั้นนี้มีวิธีmd5DigestAsHex()
การทำงาน
คุณสามารถลองต่อไปนี้ ดูรายละเอียดและรหัสดาวน์โหลดได้ที่นี่: 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();
}
}
คำตอบของ Bombe นั้นถูกต้องอย่างไรก็ตามโปรดทราบว่าหากคุณไม่จำเป็นต้องใช้ MD5 (เช่นบังคับให้คุณใช้งานร่วมกันได้) ทางเลือกที่ดีกว่าคือ SHA1 เนื่องจาก MD5 มีจุดอ่อนสำหรับการใช้งานระยะยาว
ฉันควรเพิ่มว่า SHA1 ยังมีช่องโหว่ทางทฤษฎี แต่ไม่รุนแรงเหมือนกัน สถานะปัจจุบันของศิลปะในการแปลงแป้นพิมพ์คือมีฟังก์ชันแฮชแทนจำนวนมาก แต่ยังไม่มีวิธีปฏิบัติที่ดีที่สุดในการแทนที่ SHA1 ดังนั้นขึ้นอยู่กับความต้องการของคุณคุณจะได้รับคำแนะนำที่ดีในการกำหนดอัลกอริทึมแฮชของคุณเพื่อให้สามารถเปลี่ยนได้ในอนาคต
การใช้งานอื่น: การดำเนินการอย่างรวดเร็วของ MD5 ใน Java
String hash = MD5.asHex(MD5.getHash(new File(filename)));
ฉันไม่ทราบว่าสิ่งนี้เกี่ยวข้องกับใครก็ตามที่อ่านข้อความนี้หรือไม่ แต่ฉันเพิ่งมีปัญหาที่ฉันต้องการ
ฉันต้องการที่จะทำกับชั้นเรียน JRE เท่านั้น (ไม่มี Apache Commons หรือคล้ายกัน) การค้นหาเว็บอย่างรวดเร็วไม่ได้แสดงตัวอย่างโค้ดที่ทำทั้งสองอย่างในเวลาเดียวกันโดยแยกเฉพาะแต่ละงาน เนื่องจากสิ่งนี้ต้องการอ่านไฟล์เดียวกันสองครั้งฉันคิดว่ามันอาจจะคุ้มค่าในขณะที่เขียนโค้ดซึ่งรวมทั้งงานทั้งสองคำนวณการตรวจสอบการทำงานของไฟล์ในขณะที่ดาวน์โหลดไฟล์ นี่คือผลลัพธ์ของฉัน (ขออภัยถ้ามันไม่ได้เป็นจาวาที่สมบูรณ์แบบ แต่ฉันคิดว่าคุณจะได้รับความคิดต่อไป):
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)
);
}
ลองดูที่ลิงค์ต่อไปนี้ตัวอย่างได้รับ MD5 Hash ของภาพที่ให้มา: MD5 Hash ของรูปภาพ
สำหรับสิ่งที่คุ้มค่าฉันสะดุดกับสิ่งนี้เพราะฉันต้องการสังเคราะห์ GUID จากคีย์ธรรมชาติสำหรับโปรแกรมที่จะติดตั้งคอมโพเนนต์ COM; ฉันต้องการ syhthesize เพื่อที่จะไม่จัดการวงจรชีวิตของ GUID ฉันจะใช้ MD5 แล้วใช้คลาส UUID เพื่อดึงสตริงออกมา (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 ทำให้เกิดปัญหานี้ขึ้น)
ไม่ว่าในกรณีใด java.util.UUID สามารถรับสตริงที่ดีจาก MD5 ไบต์
return UUID.nameUUIDFromBytes(md5Bytes).toString();
MessageDigest
(ดูซอร์สโค้ด nameUUIDFromBytes () )
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();
ซึ่งแตกต่างจาก PHP ที่คุณสามารถทำ MD5 hashing ข้อความของคุณโดยเพียงแค่เรียกฟังก์ชั่น md5 เช่นmd5($text)
ใน Java มันมีความซับซ้อนเล็กน้อย ฉันมักจะใช้มันโดยการเรียกฟังก์ชั่นซึ่งจะส่งกลับข้อความแฮช md5 นี่คือวิธีที่ฉันใช้มันขั้นแรกสร้างฟังก์ชั่นที่มีชื่อmd5hashing
ในคลาสหลักของคุณตามที่ระบุด้านล่าง
public static String md5hashing(String text)
{ String hashtext = null;
try
{
String plaintext = text;
MessageDigest m = MessageDigest.getInstance("MD5");
m.reset();
m.update(plaintext.getBytes());
byte[] digest = m.digest();
BigInteger bigInt = new BigInteger(1,digest);
hashtext = bigInt.toString(16);
// Now we need to zero pad it if you actually want the full 32 chars.
while(hashtext.length() < 32 ){
hashtext = "0"+hashtext;
}
} catch (Exception e1)
{
// TODO: handle exception
JOptionPane.showMessageDialog(null,e1.getClass().getName() + ": " + e1.getMessage());
}
return hashtext;
}
ตอนนี้เรียกใช้ฟังก์ชั่นเมื่อใดก็ตามที่คุณต้องการตามที่ระบุด้านล่าง
String text = textFieldName.getText();
String pass = md5hashing(text);
ที่นี่คุณจะเห็นว่า hashtext ต่อท้ายด้วยศูนย์เพื่อให้ตรงกับ md5 hashing ใน PHP
MD5 นั้นสมบูรณ์แบบถ้าคุณไม่ต้องการการรักษาความปลอดภัยที่ดีที่สุดและถ้าคุณกำลังทำสิ่งต่าง ๆ เช่นการตรวจสอบความสมบูรณ์ของไฟล์การรักษาความปลอดภัยนั้นไม่ใช่การพิจารณา ในกรณีเช่นนี้คุณอาจต้องการพิจารณาบางสิ่งที่ง่ายขึ้นและเร็วขึ้นเช่น Adler32 ซึ่งรองรับโดยไลบรารี Java
อันนี้ให้ md5 ตรงตามที่คุณได้รับจากฟังก์ชั่น md5 ของ mysql หรือฟังก์ชั่น md5 ของ php เป็นต้นนี่คือสิ่งที่ฉันใช้ (คุณสามารถเปลี่ยนได้ตามความต้องการของคุณ)
public static String md5( String input ) {
try {
java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");
byte[] array = md.digest(input.getBytes( "UTF-8" ));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < array.length; i++) {
sb.append( String.format( "%02x", array[i]));
}
return sb.toString();
} catch ( NoSuchAlgorithmException | UnsupportedEncodingException e) {
return null;
}
}
ลองนี้:
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)
คุณสามารถสร้าง MD5 แฮชสำหรับข้อความที่กำหนดโดยใช้วิธีการในMessageDigest
ชั้นเรียนในjava.security
แพ็คเกจ ด้านล่างนี้เป็นข้อมูลโค้ดที่สมบูรณ์
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import javax.xml.bind.DatatypeConverter;
public class MD5HashGenerator
{
public static void main(String args[]) throws NoSuchAlgorithmException
{
String stringToHash = "MyJavaCode";
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
messageDigest.update(stringToHash.getBytes());
byte[] digiest = messageDigest.digest();
String hashedOutput = DatatypeConverter.printHexBinary(digiest);
System.out.println(hashedOutput);
}
}
เอาต์พุตจากฟังก์ชัน MD5 คือแฮช 128 บิตที่แสดงด้วยเลขฐานสิบหก 32 ตัว
ในกรณีที่ถ้าคุณใช้ฐานข้อมูลเช่น MySQL คุณสามารถทำได้ด้วยวิธีที่ง่ายกว่าเช่นกัน แบบสอบถามSelect MD5(“text here”)
จะส่งคืนแฮช MD5 ของข้อความในวงเล็บ
นี่คือสิ่งที่ฉันมาที่นี่เพื่อฟังก์ชั่นสกาล่าที่มีประโยชน์ซึ่งส่งคืนสตริงของ 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));
}
}
มีบทความเกี่ยวกับ Codingkit เกี่ยวกับเรื่องนี้ ลองดู: http://codingkit.com/a/JAVA/2013/1020/2216.html