আমি কীভাবে MD5 হ্যাশ তৈরি করতে পারি?


1006

জাভাতে কোনও স্ট্রিংয়ের এমডি 5 হ্যাশ তৈরির কোনও পদ্ধতি আছে কি?



40
এমডি 5 একমুখী সুরক্ষা বৈশিষ্ট্য হিসাবে অনিরাপদ হতে পারে তবে জেনেরিক চেকসাম অ্যাপ্লিকেশনগুলির জন্য এটি এখনও ভাল।
rustx

আপনি পিএইচপি চেষ্টা করতে পারেন, খুব সহজে সমাধান করা।
অনুপম হালদকর

উত্তর:


601

আপনি প্রয়োজন java.security.MessageDigest

আপনার MessageDigest.getInstance("MD5")কোনও MD5 উদাহরণ MessageDigestব্যবহার করতে কল করতে কল করুন ।

এর মধ্যে একটি করে হ্যাশ গণনা করুন:

  • সম্পূর্ণ ইনপুটটিকে একটি হিসাবে byte[]খাওয়ান এবং এর সাথে একটি ক্রিয়াকলাপে হ্যাশ গণনা করুন md.digest(bytes)
  • একবারে ফোন করে MessageDigestএক byte[]অংশকে খাওয়ান md.update(bytes)। আপনি যখন ইনপুট বাইট যোগ করার কাজ শেষ করেন, তখন হ্যাশটি দিয়ে গণনা করুন md.digest()

byte[]ফিরে দ্বারা md.digest()MD5 হ্যাশ হয়।


144
একটি জিনিস যা এখানে উল্লেখ করা হয়নি, এবং আমাকে অবাক করে দিয়েছিল। ম্যাসেজডিজ্ট ক্লাসগুলি থ্রেড নিরাপদ নয়। যদি সেগুলি বিভিন্ন থ্রেড দ্বারা ব্যবহৃত হতে চলেছে তবে তাদের পুনরায় ব্যবহারের চেষ্টা না করে কেবল একটি নতুন তৈরি করুন।
mjuarez

39
এটি এর অভ্যন্তরীণ অবস্থা পরিবর্তন করতে একাধিক পদ্ধতি ব্যবহার করে। থ্রেড সুরক্ষার অভাব কীভাবে আশ্চর্য হতে পারে?
বোম্বে

90
@Bombe কেন আমরা আশা করতে আছে MessageDigest অভ্যন্তরীণ অবস্থা সম্পর্কে জানতে?
ড্যান বারোই

28
@DanBarowy ভাল, আপনি হয় এটা mutating তাই যতক্ষণ না প্রমাণিত অন্যথায় আপনি সবসময় অনুমান করা উচিত এটি থ্রেড-নিরাপদ নয় তা করার (অর্থাত পদ্ধতি মান আসতে না কিন্তু অন্যান্য পদ্ধতির কারণ বিভিন্ন মান প্রত্যাবর্তন কলিং)।
বোম্বে

3
@ ট্রুবেনফুচস MessageDigestআপনাকে খণ্ডে ডেটা ইনপুট করতে দেয়। স্থির পদ্ধতিতে এটি সম্ভব হবে না। আপনি তর্ক করতে পারেন যদিও আপনি যখন সমস্ত ডেটা একসাথে পাস করতে পারেন তখন তাদের সুবিধার জন্য যে কোনও উপায়ে যুক্ত করা উচিত ছিল।
ব্যবহারকারী 253751

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")। এএসসিআইআই একটি 7-বিট চরিত্রের সেট, ল্যাটিন 1 একটি 8-বিট অক্ষরের সেট। তারা একই নয়।
বোম্বে

8
(আরও ভাল যুক্তিযুক্ত ব্যাখ্যা এবং ব্যাখ্যার জন্য joelonsoftware.com/articles/Unicode.html দেখুন )
পিসকভোর

14
ফলাফলের বাইটগুলি হেক্স স্ট্রিংয়ে রূপান্তর করতে হলে এই বিষয়টিও কার্যকর।
সপ্তাহের

1
তাহলে আপনি কীভাবে এই ডিজিটটিকে স্ট্রিংয়ে রূপান্তর করবেন যাতে আমরা এটি মাইএসকিএলে inোকাতে পারি?
হামফ্রে

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
@ বালুসসি: সত্য নয়, বিগইন্টেজার.টো স্ট্রিং পদ্ধতিটি উল্লিখিত বেসটিতে পুরো নম্বরটি ফিরিয়ে দেবে। 0x0606 606 হিসাবে মুদ্রিত হবে, কেবল পিছনের শূন্যগুলি বাদ দেওয়া হবে
স্পাইডি

11
মাইনর নাইটপিক: মি.রেসেট () getInstance কল করার পরে ঠিক নেই। আরও গৌণ: 'আপনার পাঠ্য এখানে' ডাবল-কোট দরকার requires
ডেভিড লেপপিক

জাভা 11 থেকে, আপনি এর hashtext = "0".repeat(32 - hashtext.length()) + hashtextপরিবর্তে ব্যবহার করতে পারেন while, তাই সম্পাদকরা আপনাকে কোনও সতর্কতা দেয় না যে আপনি একটি লুপের মধ্যে স্ট্রিং কনটেনটেশন করছেন।
টম

এম.প্যাডেটের পরিবর্তে (প্লেইনটেক্সট.জেটবাইটস ()); আমি এনকোডিং নির্দিষ্ট করার পরামর্শ দেব। যেমন m.update (প্লেইনটেক্সট.জেটবাইটস ("ইউটিএফ -8")); getBytes () এনকোডিংয়ের গ্যারান্টি দেয় না এবং সিস্টেম থেকে সিস্টেমে পরিবর্তিত হতে পারে যার ফলে একই স্ট্রিংয়ের সিস্টেমগুলির মধ্যে বিভিন্ন MD5 ফলাফল হতে পারে।
1819780

255

এছাড়াও আপনি তাকান করতে চাইবেন DigestUtils Apache বর্গ কমন্স কোডেক প্রকল্প, যা MD5 অথবা SHA digests তৈরি করতে খুব সুবিধাজনক পদ্ধতি প্রদান করে।


2
বিশেষত, পদ্ধতিগুলি স্ট্রিং আকারে বাইট ডেটার উপস্থাপনা এনকোডযুক্ত "নিরাপদ" করে "
রব

4
তবে আপনার প্রকল্পে ডাইজেস্টটিলস ক্লাস পাওয়ার কোনও সহজ উপায় নেই এক টন লিবস যোগ না করে বা "প্রতি হাত" ক্লাসটি বন্দর করা যাতে কমপক্ষে আরও দুটি ক্লাস প্রয়োজন।
iuiz

ম্যাভেন রেপোতেও এটি খুঁজে পাচ্ছেন না। Grrrr।
স্পার্কস্পাইডার

5
সেন্ট্রাল মাভেন সংগ্রহস্থলগুলিতে থাকা উচিত, যতক্ষণ না আমি পাগল হয়ে যাব: গ্রুপআইডি = কমন্স-কোডেক আর্টিক্যাক্ট আইডি = কমন্স-কোডেক সংস্করণ = 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;
}

নীচের সাইটে, আমি এর জন্য কোনও ক্রেডিট নিই না, তবে এটি একটি সমাধান যা কাজ করে! আমার জন্য প্রচুর অন্যান্য কোড সঠিকভাবে কাজ করে নি, আমি হ্যাশটিতে 0 গুলি হারিয়েছি। এটি পিএইচপি-র মতোই বলে মনে হচ্ছে। সূত্র: http://m2tec.be/blog/2010/02/03/java-md5-hex-0093


15
আপনার ব্যবহৃত এনকোডিংটি নির্দিষ্ট করতে হবে getBytes(), অন্যথায় আপনার কোডটি বিভিন্ন প্ল্যাটফর্ম / ব্যবহারকারী সেটিংসে বিভিন্ন ফলাফল পাবে।
পাওলো ইবারম্যান

@ PaŭloEbermann ম্যাসেজডিজাস্ট.জেটইনস্ট্যান্স করে ("MD5"); যথেষ্ট না? আমি getBytes (") এ" MD5 "যুক্ত করার চেষ্টা করেছি তবে এটি একটি ত্রুটি ফিরিয়ে দিয়েছে
ব্লেজ তামা

2
@ ব্লাজটাইমা "এমডি 5" কোনও এনকোডিং নয়, এটি একটি বার্তা ডাইজেস্ট অ্যালগরিদম (এবং এটি নতুন অ্যাপ্লিকেশনগুলিতে ব্যবহার করা উচিত নয়)। একটি এনকোডিং হল একটি অ্যালগরিদম জুটি যা বাইটগুলিকে স্ট্রিং এবং স্ট্রিংগুলিকে বাইটে রূপান্তর করে। একটি উদাহরণ হবে "ইউটিএফ -8", "ইউএস-এএসসিআইআই", "আইএসও -8859-1", "ইউটিএফ-16 বিই", এবং অনুরূপ। এই স্ট্রিংয়ের একটি হ্যাশ গণনা করে এমন অন্যান্য দলের মতো একই এনকোডিং ব্যবহার করুন, অন্যথায় আপনি বিভিন্ন ফলাফল পাবেন।
পাওলো ইবারম্যান

6
চরিত্রের সেটটির উদাহরণের জন্য ... (ইউটিএফ -8 ব্যবহার করুন, এটি আমার মতে সেরা এবং সবচেয়ে উপযুক্ত compatible) ...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
আপনি যদি অ্যাপাচি কমন্স কোডেক যাইহোক ব্যবহার করেন তবে আপনি ব্যবহার করতে পারেন: commons.apache.org/codec/api-release/org/apache/commons/codec/…
স্কুইড

13
আমি String result = Hex.encodeHexString(resultByte);
এটির

84

আমি সবেমাত্র কমন্স-কোডেক.জার ডাউনলোড করেছি এবং এমডি 5 এর মতো নিখুঁত পিএইচপি পেয়েছি। এখানে ম্যানুয়াল

এটি কেবল আপনার প্রকল্পে আমদানি করুন এবং ব্যবহার করুন

String Url = "your_url";

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

এবং সেখানে আপনি এটা আছে.


1
এই পদ্ধতিটি মাইএসকিউএল ফাংশন এমডি 5 (স্ট্র) হিসাবে একই রিটার্ন মান সরবরাহ করে। অন্যান্য উত্তরগুলির মধ্যে অনেকগুলি অন্যান্য মানগুলি দেয়।
rwitzel

1
এই Android এর উপর ডান কাজ করে না কারণ অ্যানড্রইড থোকায় Commons-কোডেক 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
গ্রেট। এটি নেতৃস্থানীয় শূন্যগুলি কাটার ফাঁদে পড়ে না।
মার্কাস Pscheidt

2
আপনি যদি এপিআই লেভেল <19 ব্যবহার করেন তবে অ্যান্ড্রয়েডের পক্ষে এটি কাজ করবে না সাবধান, তবে আপনাকে কেবল দ্বিতীয় লাইনটি এমডি 5.আপডেট (স্ট্রিংগেটবাইটস ("ইউটিএফ -8")) দিয়ে পরিবর্তন করতে হবে; এটি হ্যান্ডেল করার জন্য আরও একটি চেক করা ব্যতিক্রম যুক্ত করবে, যদিও ...
ফ্রান মারজোয়া

34

এমডি 5 হ্যাশ থেকে কোনও স্ট্রিং প্রতিনিধিত্ব পাওয়ার শর্তে এই সমাধানটি বেশ পরিচ্ছন্ন Found

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
অন্যান্য, সংক্ষিপ্ত এবং কম বর্ণনামূলক উত্তরটিতে +146 থাকলে কেন এই উত্তরটি -1 রয়েছে?
নীলজোর

4
হেক্সের মান +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
@ কুর্টআলফ্রেডক্লুভার 'হ্যাশিং.এমডি 5 ()। হ্যাশস্ট্রিং ("আমার স্ট্রিং", চরসেটস.উইচএফ_8) .এসবাইটস () "
জাস্টিন

31

অন্য বাস্তবায়ন:

import javax.xml.bind.DatatypeConverter;

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

2
আমি কেবল একটি লাইনার দেখেছি যা কোনও বাহ্যিক লাইব্রেরি ব্যবহার করে না।
holmis83

যদি না আমি ভুল করে ফেলি তবে সর্বদা বড় হাতের অক্ষরে ফিরে আসে যা হেক্স ব্যবহার না করে এমডি 5 এর তৈরি করা হবে না। এমনকি সত্যই নিশ্চিত নয় যে এটি সত্যই এমডি 5
ওয়ালশি 4

2
@ Walshie4 এ হেক্স ছাড়া এমডি 5 নেই ( ietf.org/rfc/rfc1321.txt দেখুন ), এটি ছোট হাতের অক্ষরে কেবলমাত্র .toLower () যোগ করুন। উদাহরণগুলির সাথে উদাহরণগুলির সাথে ফলাফলের তুলনা করুন যেমন en.wikedia.org/wiki/MD5 তবে জাভাস লাইব্রেরি কোডটি সঠিক বলে বিশ্বাস করার জন্য আপনার আরও ভাল সুযোগ হবে।
স্ট্যাকার

28

আমার একটি ক্লাস (হ্যাশ) ফর্ম্যাটগুলিতে হ্যাশটিতে পাঠ্য রূপান্তর করতে হবে: এমডি 5 বা শ 1, পিএইচপি ফাংশন ( এমডি 5 , শ 1 ) সিমিলার :

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 এর সাথে পরীক্ষা করা ing

পিএইচপি স্ক্রিপ্ট:

<?php

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

আউটপুট পিএইচপি স্ক্রিপ্ট:

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

}

গিটহাবে কোড

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


@ সিড্রিকসিমন যেমন বলেছিলেন, ঠিক তেমনই আমি খুঁজছিলাম। উপভোট এখানে .. ধন্যবাদ!
জোবায়ে লুচেনা

24

এটিকে খুব জটিল করার দরকার নেই।
ডাইজেস্টটিলগুলি দুর্দান্ত কাজ করে এবং 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()যা কাজ করে।


বিটিডাব্লু: হেক্স স্ট্রিং প্রতিনিধিত্ব তৈরি করতে বিগইন্টিজার ব্যবহার করে এর পারফরম্যান্স আরও ভাল।
জেমস

17

আপনি নিম্নলিখিত চেষ্টা করতে পারেন। বিশদ এবং ডাউনলোড কোডগুলি এখানে দেখুন: http://jkssweetLive.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 ব্যবহার করবেন না (যেমন আন্তঃব্যবহারের জন্য আপনাকে বাধ্য করা), MD5 দীর্ঘমেয়াদী ব্যবহারের জন্য দুর্বলতা হিসাবে একটি ভাল পছন্দ SHA1।

আমার যুক্ত করা উচিত যে এসএএএ 1 এর তাত্ত্বিক দুর্বলতাও রয়েছে তবে তীব্র নয়। হ্যাশিংয়ে শিল্পের বর্তমান অবস্থাটি হ'ল এখানে প্রচুর প্রার্থী প্রতিস্থাপন হ্যাশ ফাংশন রয়েছে তবে SHA1 প্রতিস্থাপনের জন্য এখনও কোনও আদর্শ মানের অনুশীলন হিসাবে আবির্ভূত হয়নি। সুতরাং, আপনার প্রয়োজনের উপর নির্ভর করে আপনার হ্যাশ অ্যালগরিদমটি কনফিগারযোগ্য করার জন্য আপনাকে পরামর্শ দেওয়া হবে যাতে এটি ভবিষ্যতে প্রতিস্থাপন করা যায়।


আপনি কি আমাকে এমন কিছু সংস্থানগুলিতে নির্দেশ করতে পারেন, যেখানে আমি প্রতিটিটির তুলনামূলক যোগ্যতা এবং দুর্বলতাগুলি সম্পর্কে পড়তে পারি?
অক্ষয়

সম্ভবত এই মুহূর্তে আপনি সবচেয়ে ভাল করতে পারেন SHA1 ব্যবহার করুন এবং ভবিষ্যতে এটি প্রতিস্থাপনের জন্য প্রস্তুত থাকুন। আপনি আরও নতুন ফাংশন ব্যবহার করতে পারেন তবে সেগুলি এখনও প্রচুর পরিমাণে গবেষণার বিষয় হতে পারে নি। এই পরিবর্তনগুলি কখন পরিবর্তন হয় তা জানতে আপনি অনলাইন সুরক্ষা সংস্থানগুলি ট্র্যাক করতে পারেন - উদাহরণস্বরূপ ব্রুস শ্নিয়ারের ব্লগ।
খোলামেলা

7
আপনি যদি কোনও ক্রিপ্টোগ্রাফিকভাবে সুরক্ষিত হ্যাশ না চান তবে SHA1 ওভারকিল হবে, আপনি হ্যাশটিকে মূল বার্তাটি পুনর্গঠনে সহায়তা করতে চান না এবং আপনি কোনও চালাক আক্রমণকারীকে হ্যাশের সাথে মেলে এমন কোনও বার্তা তৈরি করতে চান না। যদি আসলটি কোনও গোপন না হয় এবং হ্যাশটি সুরক্ষার জন্য ব্যবহার না করা হয়, MD5 দ্রুত এবং সহজ। উদাহরণস্বরূপ, গুগল ওয়েব টুলকিট জাভাস্ক্রিপ্ট ইউআরএলগুলিতে MD5 হ্যাশগুলি ব্যবহার করে (যেমন foo.js? হ্যাশ = 12345)।
ডেভিড লেপপিক

12

আরেকটি বাস্তবায়ন: জাভাতে দ্রুত MD5 বাস্তবায়ন

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

1
এটি একটি শক্তিশালী, স্বল্পতম নির্ভরতা সহ একক লাইব্রেরি। ভাল জিনিস.
আজাক্স

আমি এটি খুব দরকারী খুঁজে পেয়েছি। এটি 4.57 গিগাবাইট ফাইলের জন্য 15357 এমএস নিয়েছে যখন জাভা ইনবিল্ট বাস্তবায়ন 19094 এমএস নিয়েছে।
বিকাশ

11

এটি পড়ার জন্য কারও পক্ষে এটি প্রাসঙ্গিক কিনা তা আমি জানি না, তবে আমার কেবল সমস্যাটিই ছিল যা আমি চাইছিলাম

  • প্রদত্ত ইউআরএল থেকে একটি ফাইল ডাউনলোড করুন এবং
  • এর MD5 একটি জ্ঞাত মানের সাথে তুলনা করুন।

আমি এটি কেবল জেআরই ক্লাসে করতে চেয়েছি (কোনও অ্যাপাচি কমন্স বা অনুরূপ নয়)। একটি তাত্ক্ষণিক ওয়েব অনুসন্ধান আমাকে নমুনা কোড স্নিপেটগুলি একই সময়ে উভয়ই করতে দেখায়নি , কেবলমাত্র প্রতিটি কাজ আলাদাভাবে। যেহেতু এটি একই ফাইলটি দু'বার পড়তে হবে, আমি বুঝতে পেরেছিলাম যে কোনও কোড লিখলে এটি কার্যকর হবে যা উভয় টাস্ককে এক করে দেয়, ফাইলটি ডাউনলোড করার সময় ফ্লাইতে চেকসাম গণনা করে। এটি আমার ফলাফল (দুঃখিত যদি এটি নিখুঁত জাভা না হয় তবে আমার ধারণা আপনি যেভাবেই এই ধারণাটি পেয়েছেন):

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
ওহ বিটিডাব্লু, আমার জেআরই জ্ঞানটি আসলে কতটা খারাপ তা আমার নজরে ব্যতীত কেউ আগে: আমি সবেমাত্র ডাইজেস্টইনপুটস্ট্রিম এবং ডাইজেস্টআউটপুট স্ট্রিম আবিষ্কার করেছি । আমি স্রেফ যা শিখলাম তা প্রতিবিম্বিত করতে আমার মূল সমাধানটি সম্পাদনা করতে যাচ্ছি।
kriegaex


6

এটির মূল্যের জন্য, আমি হোঁচট খেয়েছি কারণ আমি একটি প্রোগ্রামের জন্য একটি প্রাকৃতিক কী থেকে জিইউইডিগুলি সংশ্লেষ করতে চাই যা সিওএম উপাদানগুলি ইনস্টল করবে; আমি জিইউইড লাইফাইসাইকেলটি পরিচালনা না করার জন্য syhthesize করতে চাই। আমি MD5 ব্যবহার করব এবং তারপরে একটি স্ট্রিং পেতে ইউআইডি ক্লাস ব্যবহার করব। (http://stackoverflow.com/questions/2190890/how-can-i-generate-guid-for-a-string-values/12867439 এই সমস্যাটি উত্থাপন করে)।

যাইহোক, java.util.UUID আপনাকে এমডি 5 বাইট থেকে একটি দুর্দান্ত স্ট্রিং পেতে পারে।

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

আসলে এটি কেবল এমডি 5 বাইট অ্যারে গ্রহণ করে না (আকার == 16)। আপনি যে কোনও দৈর্ঘ্যের বাইট অ্যারে পাস করতে পারেন। এটি এমডি 5 এর মাধ্যমে এমডি 5 বাইট অ্যারে রূপান্তরিত হবে MessageDigest(নাম ইউইউটিউফফ্রাইটবাইটস () উত্স কোড দেখুন )
Lu55

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

পিএইচপি এর বিপরীতে যেখানে আপনি কেবল এমডি 5 ফাংশন কল করে আপনার পাঠ্যের একটি এমডি 5 হ্যাশিং করতে পারেন md5($text), জাভাতে এটি কিছুটা জটিল করে তুলেছিল। আমি সাধারণত এটি এমন কোনও ফাংশন কল করে প্রয়োগ করি যা এমডি 5 হ্যাশ পাঠ্যটি দেয়। এখানে আমি এটি কীভাবে বাস্তবায়ন করেছি তা 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);

এখানে আপনি দেখতে পাচ্ছেন যে পিএইচপি-তে এমডি 5 হ্যাশিংয়ের সাথে এটি মিলিয়ে দেওয়ার জন্য হ্যাশটেক্সট একটি শূন্যের সাথে যুক্ত হয়েছে।


5

আপনার সেরা সুরক্ষার প্রয়োজন না হলে MD5 পুরোপুরি ঠিক আছে, এবং আপনি যদি ফাইল অখণ্ডতা যাচাইয়ের মতো কিছু করে থাকেন তবে সুরক্ষা বিবেচ্য নয়। যেমন আপনি অ্যাডলার 32 এর মতো জাভা লাইব্রেরি দ্বারা সমর্থিত সহজ এবং দ্রুত কিছু বিবেচনা করতে চাইতে পারেন।


2
কীসের ফলে আপনি মনে করেন যে ফাইল অখণ্ডতা কোনও সুরক্ষা সমস্যা নয়?
জেরেমি হুইস্ক্যাম্প

5

আপনি মাইএসকিএল এর এমডি 5 ফাংশন বা পিএইচপি এর এমডি 5 ফাংশন ইত্যাদির কাছ থেকে পেয়ে যাবেন ঠিক এই এমডি 5 দেয় এটি আমি ব্যবহার করি (আপনি আপনার প্রয়োজন অনুযায়ী পরিবর্তন করতে পারেন)

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
এটি সম্ভবত সবচেয়ে খারাপ সমাধান কারণ এটি শূন্যস্থান নেতৃস্থানীয়।
জান্নিক

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
এই কোটলিন ভাষা?
ইসুরু

3
@ ইসুরুর দেখতে স্কালার মতো
গিল্ডার

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 ফাংশন থেকে আউটপুট হল 128 বিট হ্যাশ যা 32 হেক্সাডেসিমাল সংখ্যা দ্বারা উপস্থাপিত হয়।

যদি আপনি মাইএসকিউএল এর মতো ডাটাবেস ব্যবহার করেন তবে আপনি আরও সহজ উপায়ে এটি করতে পারেন। কোয়েরিটি Select MD5(“text here”)বন্ধনীতে পাঠ্যের MD5 হ্যাশটি ফিরিয়ে দেবে।


2

এটি আমি এখানে এসেছি - একটি কার্যকর স্কাল ফাংশন যা MD5 হ্যাশটির স্ট্রিং দেয়:

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 t

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.