क्या जावा में स्ट्रिंग के MD5 हैश उत्पन्न करने की कोई विधि है?
क्या जावा में स्ट्रिंग के MD5 हैश उत्पन्न करने की कोई विधि है?
जवाबों:
आपको जरूरत है java.security.MessageDigest
।
आप MessageDigest.getInstance("MD5")
का एमडी 5 उदाहरण प्राप्त करने के लिए कॉल 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
, इसलिए संपादक आपको चेतावनी नहीं देंगे कि आप एक लूप के अंदर स्ट्रिंग संयोजन कर रहे हैं।
आप अपाचे कॉमन्स कोडेक प्रोजेक्ट के डाइजेस्ट यूटिल्स क्लास को भी देखना चाह सकते हैं , जो एमडी 5 या एसएचए डाइजेस्ट बनाने के लिए बहुत सुविधाजनक तरीके प्रदान करता है।
यह मिला:
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
से अपाचे कॉमन्स परियोजना ।
String result = Hex.encodeHexString(resultByte);
मैं बस commons-codec.jar डाउनलोड किया और md5 की तरह सही php मिला। यहाँ मैनुअल है ।
बस इसे अपनी परियोजना और उपयोग के लिए आयात करें
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()));
यह समाधान मिला जो एमडी 5 हैश से एक स्ट्रिंग प्रतिनिधित्व प्राप्त करने के मामले में बहुत साफ है।
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));
इसे हल करना चाहिए। 'हैश' हैश का बाइट [] है।
एक अन्य विकल्प अमरूद हाशिंग विधियों का उपयोग करना है :
Hasher hasher = Hashing.md5().newHasher();
hasher.putString("my string");
byte[] md5 = hasher.hash().asBytes();
यदि आप पहले से ही अमरूद का उपयोग कर रहे हैं (जो यदि आप नहीं हैं, तो आपको शायद होना चाहिए)।
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)
अपरकेस फॉर्म रखने के लिए
आप निम्नलिखित कोशिश कर सकते हैं। विवरण देखें और कोड डाउनलोड करें: 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();
}
}
बॉम्बे का उत्तर सही है, हालांकि ध्यान दें कि जब तक आप एमडी 5 (जैसे इंटरऑपरेबिलिटी के लिए आप पर मजबूर हो) का उपयोग न करें, एक बेहतर विकल्प SHA1 है क्योंकि एमडी 5 में दीर्घकालिक उपयोग के लिए कमजोरियां हैं।
मुझे यह जोड़ना चाहिए कि SHA1 में सैद्धांतिक कमजोरियां भी हैं, लेकिन उतना गंभीर नहीं है। हैशिंग में कला की वर्तमान स्थिति यह है कि कई उम्मीदवार प्रतिस्थापन हैश फ़ंक्शन हैं, लेकिन SHA1 को बदलने के लिए मानक सर्वोत्तम अभ्यास के रूप में कोई भी अभी तक उभरा नहीं है। इसलिए, आपकी आवश्यकताओं के आधार पर आपको अपने हैश एल्गोरिथम को कॉन्फ़िगर करने योग्य बनाने की सलाह दी जाएगी ताकि भविष्य में इसे बदला जा सके।
एक और कार्यान्वयन: जावा में फास्ट एमडी 5 कार्यान्वयन
String hash = MD5.asHex(MD5.getHash(new File(filename)));
मुझे नहीं पता कि यह पढ़ने वाले किसी के लिए भी प्रासंगिक है, लेकिन मुझे सिर्फ वही समस्या थी जो मैं चाहता था
मैं इसे केवल JRE कक्षाओं (कोई अपाचे कॉमन्स या समान) के साथ करना चाहता था। एक त्वरित वेब खोज ने मुझे नमूना कोड स्निपेट दोनों एक ही समय में नहीं दिखाए , केवल प्रत्येक कार्य अलग से। चूँकि इसके लिए एक ही फाइल को दो बार पढ़ना पड़ता है, इसलिए मुझे लगा कि कुछ कोड लिखने के लिए इसकी कीमत हो सकती है जो दोनों कार्यों को एकीकृत करता है, फ़ाइल डाउनलोड करते समय फ्लाई पर चेकसम की गणना करता है। यह मेरा परिणाम है (क्षमा करें यदि यह पूर्ण जावा नहीं है, लेकिन मुझे लगता है कि आपको वैसे भी विचार मिलता है):
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)
);
}
निम्नलिखित लिंक पर एक नज़र डालें, उदाहरण में एक आपूर्ति की गई छवि का एमडी 5 हैश : एक छवि का एमडी 5 हैश
इसके लायक होने के लिए, मैं इस पर अड़ गया क्योंकि मैं एक प्रोग्राम के लिए एक प्राकृतिक कुंजी से GUID को संश्लेषित करना चाहता हूं जो COM घटक स्थापित करेगा; मैं GUID जीवनचक्र का प्रबंधन नहीं करने के लिए ऐसा करना चाहता हूं। मैं एमडी 5 का उपयोग करूंगा और फिर एक स्ट्रिंग प्राप्त करने के लिए यूयूआईडी वर्ग का उपयोग करूंगा। (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 हैशिंग को केवल md5 फ़ंक्शन कह सकते हैं अर्थात md5($text)
, जावा में इसे थोड़ा जटिल बनाया गया था। मैंने आमतौर पर इसे एक फ़ंक्शन को कॉल करके लागू किया है जो 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);
यहाँ आप देख सकते हैं कि PHP में md5 हैशिंग के साथ मैच करने के लिए हैशटेक्स को एक शून्य के साथ जोड़ा गया है।
MD5 पूरी तरह से ठीक है अगर आपको सबसे अच्छी सुरक्षा की आवश्यकता नहीं है, और यदि आप फ़ाइल अखंडता की जांच कर रहे हैं, तो सुरक्षा एक विचार नहीं है। इस तरह के मामले में आप कुछ सरल और तेज विचार करना चाह सकते हैं, जैसे कि एडलर 32, जो जावा पुस्तकालयों द्वारा भी समर्थित है।
यह एक सटीक md5 देता है जैसा कि आप mysql के md5 फ़ंक्शन या php के md5 फ़ंक्शन आदि से प्राप्त करते हैं। यह वह है जिसे मैं उपयोग करता हूं (आप अपनी आवश्यकताओं के अनुसार बदल सकते हैं)
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 फ़ंक्शन से आउटपुट 32 हेक्साडेसिमल संख्याओं द्वारा दर्शाया गया 128 बिट हैश है।
मामले में, यदि आप MySQL जैसे डेटाबेस का उपयोग कर रहे हैं, तो आप इसे और भी सरल तरीके से कर सकते हैं। प्रश्न Select MD5(“text here”)
ब्रैकेट में पाठ का MD5 हैश लौटाएगा।
यह वही है जिसके लिए मैं आया था- एक आसान स्कैला फंक्शन जो एमडी 5 हैश का स्ट्रिंग लौटाता है:
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));
}
}
उस के बारे में कोडिंगकिट पर एक लेख है। देखें: http://codingkit.com/a/JAVA/2013/1020/2216.html