मैं MD5 हैश कैसे उत्पन्न कर सकता हूं?


1007

क्या जावा में स्ट्रिंग के MD5 हैश उत्पन्न करने की कोई विधि है?



40
एमडी 5 एक तरह से सुरक्षा सुविधा के रूप में असुरक्षित हो सकता है, लेकिन यह सामान्य चेकसम अनुप्रयोगों के लिए अभी भी अच्छा है।
15

आप php में कोशिश कर सकते हैं, बहुत आसानी से हल।
अनुपम हल्दकर

जवाबों:


602

आपको जरूरत है java.security.MessageDigest

आप MessageDigest.getInstance("MD5")का एमडी 5 उदाहरण प्राप्त करने के लिए कॉल MessageDigestकर सकते हैं।

निम्न में से एक करके हैश की गणना करें:

  • पूरे इनपुट को एक के रूप में फ़ीड करें byte[]और एक ऑपरेशन में हैश की गणना करें md.digest(bytes)
  • एक बार में MessageDigestएक byte[]चंक को फोन करके खिलाएं md.update(bytes)। जब आप इनपुट बाइट्स जोड़ते हैं, तो हैश की गणना करें md.digest()

byte[]लौट आने तक md.digest()MD5 हैश है।


144
एक बात जो यहाँ उल्लेखित नहीं है, और उसने मुझे आश्चर्य से पकड़ लिया। MessageDigest कक्षाएं थ्रेड सुरक्षित नहीं हैं। यदि वे अलग-अलग थ्रेड द्वारा उपयोग किए जा रहे हैं, तो उन्हें पुनः उपयोग करने के बजाय केवल एक नया बनाएं।
मज़ारेज़

39
यह अपनी आंतरिक स्थिति को बदलने के लिए कई तरीकों का उपयोग करता है। धागे की सुरक्षा की कमी कैसे आश्चर्यजनक हो सकती है?
बॉम्बे

90
@Bombe: क्यों हम की उम्मीद करनी चाहिए है MessageDigest की आंतरिक स्थिति के बारे में पता करने के लिए?
डैन ब्रौली

28
@DanBarowy अच्छी तरह से, आप इसे म्यूट कर रहे हैं (यानी कॉलिंग मेथड्स जो वैल्यूज नहीं लौटाते हैं, लेकिन दूसरे तरीके अलग-अलग वैल्यूज को लौटाते हैं) इसलिए जब तक साबित न हो जाए, तब तक आपको हमेशा यह मान लेना चाहिए कि ऐसा करने के लिए थ्रेड-सेफ नहीं है।
बॉम्बे

3
@Traubenfuchs MessageDigestआपको चंक्स में डेटा इनपुट करने की अनुमति देता है। यह एक स्थिर विधि के साथ संभव नहीं होगा। यद्यपि आप तर्क दे सकते हैं कि उन्हें सुविधा के लिए वैसे भी एक जोड़ा जाना चाहिए जब आप एक ही बार में सभी डेटा पास कर सकते हैं।
user253751

690

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()परिणामी हैश प्राप्त करने के लिए कॉल करें ।


"LATIN1"! = "ASCII" (या "US-ASCII")। ASCII एक 7-बिट कैरेक्टर सेट है, लैटिन 1 एक 8-बिट कैरेक्टर सेट है। वे एक जैसे नहीं हैं।
बॉम्बे

8
( बहुत बेहतर औचित्य और स्पष्टीकरण के लिए joelonsoftware.com/articles/Unicode.html देखें )
पिस्कॉर ने 19

14
यदि आप परिणामस्वरूप बाइट्स को हेक्स स्ट्रिंग में बदलने की आवश्यकता है तो यह विषय भी उपयोगी है।
सप्ताह

1
तो फिर आप इस thedigest को एक स्ट्रिंग में कैसे परिवर्तित करते हैं ताकि हम इसे mysql में सम्मिलित कर सकें?
हम्फ्री

2
बेहतर अभी तक, जहां संभव उपयोग yourString.getBytes(StandardCharsets.UTF_8)। यह एक हैंडलिंग से बचाता है UnsupportedEncodingException
बेन्मिंग इंजीनियरिंग बी.वी.

267

यदि आप वास्तव में एक बाइट सरणी के विपरीत स्ट्रिंग के रूप में जवाब वापस चाहते हैं, तो आप हमेशा कुछ ऐसा कर सकते हैं:

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: सच नहीं है, BigInteger.toString विधि निर्दिष्ट आधार में पूरी संख्या वापस कर देगी। 0x0606 को 606 के रूप में मुद्रित किया जाएगा, बस पीछे हटने वाले शून्य को छोड़ दिया जाएगा,
Spidey

11
माइनर नाइटपिक: get.stance को कॉल करने के बाद m.reset () आवश्यक नहीं है। अधिक मामूली: 'आपका पाठ यहाँ' को दोहरे उद्धरण चिह्नों की आवश्यकता है।
डेविड लेपिक

जावा 11 से, आप hashtext = "0".repeat(32 - hashtext.length()) + hashtextइसके बजाय का उपयोग कर सकते हैं while, इसलिए संपादक आपको चेतावनी नहीं देंगे कि आप एक लूप के अंदर स्ट्रिंग संयोजन कर रहे हैं।
टॉम

इसके बजाय m.update (plaintext.getBytes ()); मैं एन्कोडिंग निर्दिष्ट करने की सलाह दूंगा। जैसे कि m.update (plaintext.getBytes ("UTF-8")); getBytes () एन्कोडिंग की गारंटी नहीं देता है और सिस्टम से सिस्टम में भिन्न हो सकता है जिसके परिणामस्वरूप एक ही स्ट्रिंग के लिए सिस्टम के बीच अलग MD5 परिणाम हो सकते हैं।
user1819780

256

आप अपाचे कॉमन्स कोडेक प्रोजेक्ट के डाइजेस्ट यूटिल्स क्लास को भी देखना चाह सकते हैं , जो एमडी 5 या एसएचए डाइजेस्ट बनाने के लिए बहुत सुविधाजनक तरीके प्रदान करता है।


2
विशेष रूप से, जो तरीके "सुरक्षित" वापस आते हैं वे स्ट्रिंग रूप में बाइट डेटा के प्रतिनिधित्व को एन्कोड करते हैं।
रोब

4
हालाँकि, आपकी परियोजना में DigestUtils वर्ग को एक टन जोड़ने के बिना, या "प्रति हाथ" वर्ग को पोर्ट करने का कोई आसान तरीका नहीं है, जिसके लिए कम से कम दो और वर्गों की आवश्यकता होती है।
इयूज

या तो मावेन repos में नहीं मिल सकता है। Grrrr।
स्पार्कस्पाइडर

5
केंद्रीय मैवेन रिपॉजिटरी में होना चाहिए, जब तक कि मैं पागल नहीं हो जाऊं: groupId = commons-codec विरूपण साक्ष्य = कॉमन-कोडेक वर्जन = 1.5
निक स्पेसक

160

यह मिला:

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


15
आपको उपयोग किए जाने वाले एन्कोडिंग को निर्दिष्ट करना चाहिए getBytes(), अन्यथा आपके कोड को विभिन्न प्लेटफार्मों / उपयोगकर्ता सेटिंग्स पर अलग-अलग परिणाम मिलेंगे।
पाओलो एबरमन जू

@ Pa @loEbermann MessageDigest.getInstance ("MD5") करता है; पर्याप्त नहीं? मैंने getBytes में "MD5" जोड़ने की कोशिश की () लेकिन इसने एक त्रुटि लौटा दी
ब्लेज़ तमा

2
@BlazeTama "MD5" एन्कोडिंग नहीं है, यह एक संदेश डाइजेस्ट एल्गोरिथ्म है (और ऐसा नहीं जिसे नए अनुप्रयोगों में उपयोग किया जाना चाहिए)। एक एन्कोडिंग एक एल्गोरिथ्म जोड़ी है जो बाइट्स को बाइट्स और स्ट्रिंग्स को बाइट्स में बदल देती है। एक उदाहरण "UTF-8", "US-ASCII", "ISO-8859-1", "UTF-16BE" और समान होगा। हर दूसरे पक्ष के समान एन्कोडिंग का उपयोग करें जो इस स्ट्रिंग के हैश की गणना करता है, अन्यथा आपको अलग-अलग परिणाम मिलेंगे।
पाओलो एबरमन

6
चरित्र सेट के एक उदाहरण के लिए ... (यूटीएफ -8 का उपयोग करें, जो मेरी राय में सबसे अच्छा और सबसे अधिक संगत है) ...byte[] array = md.digest(md5.getBytes(Charset.forName("UTF-8")));
रिचर्ड

चूंकि इसका समाधान नहीं है, और मैंने सभी परिदृश्यों का स्वयं परीक्षण किया, इसलिए मैं इसे अपरिवर्तित छोड़ दूंगा, हालांकि मुझे लगता है कि एन्कोडिंग आदि को निर्दिष्ट करना शायद एक अच्छा विचार है।
dac2009

88

यहां बताया गया है कि मैं इसका उपयोग कैसे करता हूं:

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से अपाचे कॉमन्स परियोजना


14
अगर आप Apache Commons Codec का उपयोग करते हैं, तो आप इसका उपयोग कर सकते हैं: commons.apache.org/codec/api-release/org/apache/commons/codec/…
स्क्वीडल

13
मैं इस के साथ अंतिम पंक्ति को String result = Hex.encodeHexString(resultByte);
बदलूंगा

84

मैं बस commons-codec.jar डाउनलोड किया और md5 की तरह सही php मिला। यहाँ मैनुअल है

बस इसे अपनी परियोजना और उपयोग के लिए आयात करें

String Url = "your_url";

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

आखिर तुमने इसे हासिल कर ही लिया है।


1
यह वह विधि है जो MySQL फ़ंक्शन md5 (str) के समान रिटर्न मान प्रदान करती है। बहुत सारे अन्य उत्तरों ने अन्य मान लौटा दिए।
rwitzel

1
यह एंड्रॉइड पर सही काम नहीं करता है क्योंकि एंड्रॉइड बंडल कॉमन्स-कोडेक 1.2 है, जिसके लिए आपको इस वर्कअराउंड की आवश्यकता है: stackoverflow.com/a/9284092/2413303
EpicPandaForce

76

मैंने इसे करने का सबसे स्पष्ट और संक्षिप्त तरीका पाया है:

MessageDigest md5 = MessageDigest.getInstance("MD5");
md5.update(StandardCharsets.UTF_8.encode(string));
return String.format("%032x", new BigInteger(1, md5.digest()));

3
महान। यह अग्रणी शून्य को काटने के जाल में नहीं पड़ता है।
मार्कस साइकेडट

2
अगर आप API स्तर <19 का उपयोग कर रहे हैं, तो Android के लिए यह काम नहीं करेगा, लेकिन आपको केवल md5.update (string.getBytes ("UTF-8")) के साथ दूसरी पंक्ति बदलने की आवश्यकता है; यह अभी तक एक और जाँच किए गए अपवाद को जोड़ देगा, हालाँकि ...
Fran Marzoa

34

यह समाधान मिला जो एमडी 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));
    }
}

कोड से निकाला गया था यहाँ


2
यह उत्तर -1 क्यों है जबकि दूसरा, छोटा और कम वर्णनात्मक उत्तर +146 है?
निलज़ोर

4
BigInteger का उपयोग करके एक हेक्स मान +1 पाने के लिए अच्छा है
डेव.बी

5
मुझे अभी पता चला है कि कुछ मामलों में यह केवल 31 वर्ण लंबी MD5 राशि उत्पन्न करता है, 32 नहीं जैसा कि होना चाहिए
कोविका

3
@ कोविका इसका कारण है, अगर मुझे सही याद है, तो शुरुआती शून्य समाप्त हो जाते हैं .. String.format("%032x", new BigInteger(1, hash)); इसे हल करना चाहिए। 'हैश' हैश का बाइट [] है।
हशन परेरा

इस उत्तर में चारसेट प्रकार के साथ बग है!
दाविद दोज़द

31

एक अन्य विकल्प अमरूद हाशिंग विधियों का उपयोग करना है :

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

यदि आप पहले से ही अमरूद का उपयोग कर रहे हैं (जो यदि आप नहीं हैं, तो आपको शायद होना चाहिए)।


3
या शॉर्टकट तरीकों में से एक का उपयोग करना:Hashing.md5().hashString("my string").asBytes();
कर्ट अल्फ्रेड क्लेवर

4
@KurtAlfredKluever 'Hashing.md5 () हैशस्ट्रिंग ("मेरी स्ट्रिंग", Charsets.UTF_8) .asBytes ()'
जस्टिन

31

एक और कार्यान्वयन:

import javax.xml.bind.DatatypeConverter;

String hash = DatatypeConverter.printHexBinary( 
           MessageDigest.getInstance("MD5").digest("SOMESTRING".getBytes("UTF-8")));

2
केवल एक-लाइनर मैंने देखा है कि बाहरी पुस्तकालय का उपयोग नहीं करता है।
holmis83

जब तक मैं इस रिटर्न को हमेशा अपरकेस में नहीं रखता, जो हेक्स का उपयोग किए बिना md5 के साथ संरेखित नहीं होगा। यह भी सच नहीं है कि यह सच है md5
walshie4

2
@ walshie4 बिना हेक्स के कोई एमडी 5 नहीं है (देखें ietf.org/rfc/rfc1321.txt ), इसे लोअरकेस में बस जोड़ने के लिए .toLower () देखें। उदाहरणों के परिणामों की तुलना en.wikipedia.org/wiki/MD5 से करें, तब आपके पास यह विश्वास करने का बेहतर मौका होगा कि जावस पुस्तकालय कोड सही है।
स्टैकर

28

मेरे पास सादे पाठ को हैश में प्रारूप में परिवर्तित करने के लिए एक वर्ग (हैश) है: 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");
    }
}

JUnit और PHP के साथ परीक्षण

PHP स्क्रिप्ट:

<?php

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

आउटपुट PHP स्क्रिप्ट:

MD5 :b10a8db164e0754105b7a99be72e3fe5
SHA1:0a4d55a8d778e5022fab701977c5d840bbc486d0

उदाहरण और JUnit के साथ परीक्षण का उपयोग करना:

    public class HashTest {

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

}

GitHub में कोड

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


जैसा कि @CedricSimon ने कहा, यह वही है जिसकी मुझे तलाश थी। यहाँ उत्कर्ष .. धन्यवाद!
जोबा लुसेना

24

इसे बहुत जटिल बनाने की आवश्यकता नहीं है।
DigestUtils ठीक काम करती है और md5हैश के साथ काम करते हुए आपको आरामदायक बनाती है ।

DigestUtils.md5Hex(_hash);

या

DigestUtils.md5(_hash);

या तो आप किसी भी अन्य एन्क्रिप्शन विधियों जैसे कि shaया का उपयोग कर सकते हैं md


22

मेरा बहुत खुलासा जवाब नहीं:

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)अपरकेस फॉर्म रखने के लिए
एलेक्स

17

वसंत में भी एक DigestUtilsवर्ग है :

http://static.springsource.org/spring/docs/3.0.x/javadoc-api/org/springframework/util/DigestUtils.html

इस वर्ग में वह विधि md5DigestAsHex()है जो कार्य करती है।


BTW: इसका प्रदर्शन तब बेहतर है जब BigInteger का उपयोग करके हेक्स स्ट्रिंग प्रतिनिधित्व बनाया जाए।
जेम्स

17

आप निम्नलिखित कोशिश कर सकते हैं। विवरण देखें और कोड डाउनलोड करें: 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

बॉम्बे का उत्तर सही है, हालांकि ध्यान दें कि जब तक आप एमडी 5 (जैसे इंटरऑपरेबिलिटी के लिए आप पर मजबूर हो) का उपयोग न करें, एक बेहतर विकल्प SHA1 है क्योंकि एमडी 5 में दीर्घकालिक उपयोग के लिए कमजोरियां हैं।

मुझे यह जोड़ना चाहिए कि SHA1 में सैद्धांतिक कमजोरियां भी हैं, लेकिन उतना गंभीर नहीं है। हैशिंग में कला की वर्तमान स्थिति यह है कि कई उम्मीदवार प्रतिस्थापन हैश फ़ंक्शन हैं, लेकिन SHA1 को बदलने के लिए मानक सर्वोत्तम अभ्यास के रूप में कोई भी अभी तक उभरा नहीं है। इसलिए, आपकी आवश्यकताओं के आधार पर आपको अपने हैश एल्गोरिथम को कॉन्फ़िगर करने योग्य बनाने की सलाह दी जाएगी ताकि भविष्य में इसे बदला जा सके।


क्या आप मुझे कुछ संसाधनों की ओर संकेत कर सकते हैं, जहां मैं प्रत्येक के सापेक्ष गुणों और कमजोरियों के बारे में पढ़ सकता हूं?
अक्षय

संभवत: इस समय आप जो सबसे अच्छा कर सकते हैं वह SHA1 का उपयोग करना है और भविष्य में इसे बदलने के लिए तैयार रहना चाहिए। आप नए कार्यों का उपयोग कर सकते हैं लेकिन वे अभी तक बड़ी मात्रा में शोध के अधीन नहीं हैं। इस परिवर्तन के बारे में जानने के लिए आप ऑनलाइन सुरक्षा संसाधनों को ट्रैक कर सकते हैं - उदाहरण के लिए ब्रूस श्नीयर का ब्लॉग।
फ्रैंकडॉयर

7
SHA1 ओवरकिल है जब तक कि आप एक क्रिप्टोग्राफिक रूप से सुरक्षित हैश नहीं चाहते हैं, यानी आप मूल संदेश को फिर से संगठित करने में मदद करने के लिए हैश नहीं चाहते हैं, और न ही आप एक चतुर हमलावर चाहते हैं जो हैश से मेल खाता हो। यदि मूल कोई गुप्त नहीं है और सुरक्षा के लिए हैश का उपयोग नहीं किया जा रहा है, तो एमडी 5 तेज और आसान है। उदाहरण के लिए, Google वेब टूलकिट JavaScript URL (जैसे foo.js? Hash = 12345) में MD5 हैश का उपयोग करता है।
डेविड लेपिक

12

एक और कार्यान्वयन: जावा में फास्ट एमडी 5 कार्यान्वयन

String hash = MD5.asHex(MD5.getHash(new File(filename)));

1
यह एक ठोस, स्टैंडअलोन लाइब्रेरी है जिसमें न्यूनतम निर्भरता है। अच्छी चीज़।
अजाक्स

मैंने इसे बहुत उपयोगी पाया। यह 4.57GB फ़ाइल के लिए 15357 एमएस लिया, जबकि जावा इनबिल्ट कार्यान्वयन 19094 एमएस लिया।
bkrish

11

मुझे नहीं पता कि यह पढ़ने वाले किसी के लिए भी प्रासंगिक है, लेकिन मुझे सिर्फ वही समस्या थी जो मैं चाहता था

  • किसी दिए गए URL से एक फ़ाइल डाउनलोड करें और
  • एक ज्ञात मूल्य के लिए इसके MD5 की तुलना करें।

मैं इसे केवल 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)
        );
}

1
ओह BTW, खुद को छोड़कर किसी को भी नोटिस करने से पहले कि मेरा JRE ज्ञान वास्तव में कितना बुरा है: मैंने बस DigestInputStream और DigestOutputStream की खोज की । मैं अपने मूल समाधान को संपादित करने जा रहा हूं जो मैंने अभी सीखा है।
क्रायगैक्स


6

इसके लायक होने के लिए, मैं इस पर अड़ गया क्योंकि मैं एक प्रोग्राम के लिए एक प्राकृतिक कुंजी से 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();

वास्तव में यह न केवल एमडी 5 बाइट्स सरणी (आकार == 16) को स्वीकार करता है। आप किसी भी लम्बाई के बाइट को पास कर सकते हैं। इसे MD5 के माध्यम से MD5 बाइट्स ऐरे में परिवर्तित किया जाएगा MessageDigest( nameUUIDFromBytes () स्रोत कोड देखें )
22:55 पर लुक 55

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

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 हैशिंग के साथ मैच करने के लिए हैशटेक्स को एक शून्य के साथ जोड़ा गया है।


5

MD5 पूरी तरह से ठीक है अगर आपको सबसे अच्छी सुरक्षा की आवश्यकता नहीं है, और यदि आप फ़ाइल अखंडता की जांच कर रहे हैं, तो सुरक्षा एक विचार नहीं है। इस तरह के मामले में आप कुछ सरल और तेज विचार करना चाह सकते हैं, जैसे कि एडलर 32, जो जावा पुस्तकालयों द्वारा भी समर्थित है।


2
आपको क्या लगता है कि फ़ाइल अखंडता एक सुरक्षा मुद्दा नहीं है?
जेरेमी हुइस्कैम्प

5

यह एक सटीक 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;            
    }

}

4

इसे इस्तेमाल करे:

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
यह शायद सबसे खराब समाधान है क्योंकि यह प्रमुख शून्य को स्ट्रिप्स करता है।
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
क्या यह कोटलिन भाषा है?
ईसरू


4

आप पैकेज में कक्षा में विधियों का उपयोग करके किसी दिए गए पाठ के लिए MD5 हैश उत्पन्न कर सकते हैं । नीचे पूरा कोड स्निपेट है,MessageDigestjava.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 हैश लौटाएगा।


2

यह वही है जिसके लिए मैं आया था- एक आसान स्कैला फंक्शन जो एमडी 5 हैश का स्ट्रिंग लौटाता है:

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

उस के बारे में कोडिंगकिट पर एक लेख है। देखें: http://codingkit.com/a/JAVA/2013/1020/2216.html

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.