java - मैं एमडी 5 हैश कैसे उत्पन्न कर सकता हूं?




hash md5 (20)

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

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


आप निम्नलिखित कोशिश कर सकते हैं। विवरण देखें और यहां कोड डाउनलोड करें: http://www.luyue.org/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();
}
}

इसके लायक होने के लिए, मैंने इस पर ठोकर खाई क्योंकि मैं एक प्रोग्राम के लिए एक प्राकृतिक कुंजी से GUID को संश्लेषित करना चाहता हूं जो COM घटकों को स्थापित करेगा; मैं GUID जीवन चक्र का प्रबंधन नहीं करने के लिए syhthesize करना चाहता हूँ। मैं एमडी 5 का उपयोग करूंगा और उसके बाद एक स्ट्रिंग प्राप्त करने के लिए यूयूआईडी कक्षा का उपयोग करूंगा। (http://.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 इस समस्या को उठाता है)।

किसी भी मामले में, java.util.UUID आपको MD5 बाइट्स से एक अच्छा स्ट्रिंग प्राप्त कर सकता है।

return UUID.nameUUIDFromBytes(md5Bytes).toString();

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

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 javax.xml.bind.DatatypeConverter;

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

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



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

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


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

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

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

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 या 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 के साथ परीक्षण

PHP स्क्रिप्ट:

<?php

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

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

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

}

गिटहब में कोड

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


मैंने अभी commons-codec.jar डाउनलोड किया है और एमडी 5 की तरह सही php मिला है। manual यहाँ है।

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

String Url = "your_url";

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

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


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

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

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

}

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

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


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

def md5(text: String) : String = java.security.MessageDigest.getInstance("MD5").digest(text.getBytes()).map(0xFF & _).map { "%02x".format(_) }.foldLeft(""){_ + _}


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() को कॉल करें।


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

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)






hashcode