জাভাতে কোনও স্ট্রিংয়ের এমডি 5 হ্যাশ তৈরির কোনও পদ্ধতি আছে কি?
জাভাতে কোনও স্ট্রিংয়ের এমডি 5 হ্যাশ তৈরির কোনও পদ্ধতি আছে কি?
উত্তর:
আপনি প্রয়োজন 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 বর্গ কমন্স কোডেক প্রকল্প, যা 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;
}
নীচের সাইটে, আমি এর জন্য কোনও ক্রেডিট নিই না, তবে এটি একটি সমাধান যা কাজ করে! আমার জন্য প্রচুর অন্যান্য কোড সঠিকভাবে কাজ করে নি, আমি হ্যাশটিতে 0 গুলি হারিয়েছি। এটি পিএইচপি-র মতোই বলে মনে হচ্ছে। সূত্র: 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);
আমি সবেমাত্র কমন্স-কোডেক.জার ডাউনলোড করেছি এবং এমডি 5 এর মতো নিখুঁত পিএইচপি পেয়েছি। এখানে ম্যানুয়াল ।
এটি কেবল আপনার প্রকল্পে আমদানি করুন এবং ব্যবহার করুন
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 হ্যাশ থেকে কোনও স্ট্রিং প্রতিনিধিত্ব পাওয়ার শর্তে এই সমাধানটি বেশ পরিচ্ছন্ন 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));
}
}
কোডটি এখান থেকে তোলা হয়েছিল ।
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")));
আমার একটি ক্লাস (হ্যাশ) ফর্ম্যাটগুলিতে হ্যাশটিতে পাঠ্য রূপান্তর করতে হবে: এমডি 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");
}
}
<?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));
}
}
এটিকে খুব জটিল করার দরকার নেই।
ডাইজেস্টটিলগুলি দুর্দান্ত কাজ করে এবং 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://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();
}
}
বোম্বের উত্তরটি সঠিক, তবে মনে রাখবেন যে আপনি এমডি 5 ব্যবহার করবেন না (যেমন আন্তঃব্যবহারের জন্য আপনাকে বাধ্য করা), MD5 দীর্ঘমেয়াদী ব্যবহারের জন্য দুর্বলতা হিসাবে একটি ভাল পছন্দ SHA1।
আমার যুক্ত করা উচিত যে এসএএএ 1 এর তাত্ত্বিক দুর্বলতাও রয়েছে তবে তীব্র নয়। হ্যাশিংয়ে শিল্পের বর্তমান অবস্থাটি হ'ল এখানে প্রচুর প্রার্থী প্রতিস্থাপন হ্যাশ ফাংশন রয়েছে তবে SHA1 প্রতিস্থাপনের জন্য এখনও কোনও আদর্শ মানের অনুশীলন হিসাবে আবির্ভূত হয়নি। সুতরাং, আপনার প্রয়োজনের উপর নির্ভর করে আপনার হ্যাশ অ্যালগরিদমটি কনফিগারযোগ্য করার জন্য আপনাকে পরামর্শ দেওয়া হবে যাতে এটি ভবিষ্যতে প্রতিস্থাপন করা যায়।
আরেকটি বাস্তবায়ন: জাভাতে দ্রুত MD5 বাস্তবায়ন
String hash = MD5.asHex(MD5.getHash(new File(filename)));
এটি পড়ার জন্য কারও পক্ষে এটি প্রাসঙ্গিক কিনা তা আমি জানি না, তবে আমার কেবল সমস্যাটিই ছিল যা আমি চাইছিলাম
আমি এটি কেবল জেআরই ক্লাসে করতে চেয়েছি (কোনও অ্যাপাচি কমন্স বা অনুরূপ নয়)। একটি তাত্ক্ষণিক ওয়েব অনুসন্ধান আমাকে নমুনা কোড স্নিপেটগুলি একই সময়ে উভয়ই করতে দেখায়নি , কেবলমাত্র প্রতিটি কাজ আলাদাভাবে। যেহেতু এটি একই ফাইলটি দু'বার পড়তে হবে, আমি বুঝতে পেরেছিলাম যে কোনও কোড লিখলে এটি কার্যকর হবে যা উভয় টাস্ককে এক করে দেয়, ফাইলটি ডাউনলোড করার সময় ফ্লাইতে চেকসাম গণনা করে। এটি আমার ফলাফল (দুঃখিত যদি এটি নিখুঁত জাভা না হয় তবে আমার ধারণা আপনি যেভাবেই এই ধারণাটি পেয়েছেন):
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 হ্যাশ পেয়েছে: একটি চিত্রের MD5 হ্যাশ
এটির মূল্যের জন্য, আমি হোঁচট খেয়েছি কারণ আমি একটি প্রোগ্রামের জন্য একটি প্রাকৃতিক কী থেকে জিইউইডিগুলি সংশ্লেষ করতে চাই যা সিওএম উপাদানগুলি ইনস্টল করবে; আমি জিইউইড লাইফাইসাইকেলটি পরিচালনা না করার জন্য 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();
MessageDigest
(নাম ইউইউটিউফফ্রাইটবাইটস () উত্স কোড দেখুন )
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();
পিএইচপি এর বিপরীতে যেখানে আপনি কেবল এমডি 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 হ্যাশিংয়ের সাথে এটি মিলিয়ে দেওয়ার জন্য হ্যাশটেক্সট একটি শূন্যের সাথে যুক্ত হয়েছে।
আপনার সেরা সুরক্ষার প্রয়োজন না হলে MD5 পুরোপুরি ঠিক আছে, এবং আপনি যদি ফাইল অখণ্ডতা যাচাইয়ের মতো কিছু করে থাকেন তবে সুরক্ষা বিবেচ্য নয়। যেমন আপনি অ্যাডলার 32 এর মতো জাভা লাইব্রেরি দ্বারা সমর্থিত সহজ এবং দ্রুত কিছু বিবেচনা করতে চাইতে পারেন।
আপনি মাইএসকিএল এর এমডি 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;
}
}
এটা চেষ্টা কর:
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 হেক্সাডেসিমাল সংখ্যা দ্বারা উপস্থাপিত হয়।
যদি আপনি মাইএসকিউএল এর মতো ডাটাবেস ব্যবহার করেন তবে আপনি আরও সহজ উপায়ে এটি করতে পারেন। কোয়েরিটি 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));
}
}
সে সম্পর্কে কোডিংকিট নিয়ে একটি নিবন্ধ আছে। দেখুন: http://codingkit.com/a/JAVA/2013/1020/2216.html t