জাভাতে sha256 দিয়ে কিছু স্ট্রিং হ্যাশ করবেন কীভাবে?


210

sha256জাভাতে আমি কীভাবে কিছু স্ট্রিং হ্যাশ করতে পারি ? কেউ কি এর জন্য কোনও বিনামূল্যে গ্রন্থাগার সম্পর্কে জানেন?



উত্তর:


308

SHA-256 কোনও "এনকোডিং" নয় - এটি একমুখী হ্যাশ।

আপনি মূলত স্ট্রিংটিকে বাইটে রূপান্তর করতে চান (যেমন ব্যবহার করা text.getBytes(StandardCharsets.UTF_8)) এবং তারপরে বাইটগুলি হ্যাশ করুন। লক্ষ্য করুন হ্যাশ ফল হবে আরো নির্বিচারে বাইনারি ডেটা হতে, এবং যদি আপনি প্রতিনিধিত্ব করতে যে একটি স্ট্রিং চান, আপনি করুন Base64- বা হেক্স ব্যবহার করা উচিত ... না ব্যবহারের চেষ্টা String(byte[], String)কন্সট্রাকটর।

যেমন

MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));

18
"SHA-256 কোনও এনকোডিং নয়" একেবারে সঠিক, তবে আমি অবশ্যই বলব যে আমি বর্তমান প্রশ্নের শিরোনামটিকে "কীভাবে এনক্রিপ্ট করব" (অনেকের মনে হয় এটি এনক্রিপশন রয়েছে) এর চেয়ে বেশি পছন্দ করি। ক্রিপ্টোগ্রাফি সহ কিছু করার পরিবর্তে সম্ভবত আমাদের এটিকে এনকোডিং হিসাবে বিবেচনা করা উচিত কারণ বাস্তবে এটি কীভাবে ব্যবহৃত হয় তার কাছাকাছি।
লুক

5
: @Luc আচ্ছা এটা, একটি ক্রিপ্টোগ্রাফিক হ্যাশ তাই আমি এটা এটা বলতে অযৌক্তিক মনে করি না করেন সঙ্গে ক্রিপ্টোগ্রাফি ... এনক্রিপশন এবং ক্রিপ্টোগ্রাফি করতে বিনিময়যোগ্য নয় কিছু আছে ...
জন স্কিট

8
দ্রষ্টব্য: জাভা +++ এর আক্ষরিক পরিবর্তে স্ট্যান্ডার্ডচ্যারেটস.উইউটিএফ_ 8 ব্যবহার করা ভাল ধারণা "UTF-8": উদ্বেগের জন্য কম ব্যতীত একটি পরীক্ষা করা হয়েছে।
ক্রাইজার 21

3
কেন হ্যাশ ফলাফলের সাথে কাজ করার সময় আপনি স্ট্রিং (বাইট [], স্ট্রিং) নির্মাতা এড়ানো উচিত?
আইজাক ভ্যান বেকেল

5
@IsaacvanBakel: যেহেতু একটি হ্যাশ নয় এনকোডেড পাঠ্য। এটি নির্বিচারে বাইনারি ডেটা।
জন স্কিটি

172

আমি মনে করি সবচেয়ে সহজ সমাধানটি অ্যাপাচি কমন কোডেক ব্যবহার করা :

String sha256hex = org.apache.commons.codec.digest.DigestUtils.sha256Hex(stringText);   

1
সেরা উত্তর, ব্যবহার করা সহজ, পরিষ্কার। ধন্যবাদ!
fl0w

99

অন্য বিকল্প হ'ল পেয়ারা যা হ্যাশিং ইউটিলিটির একটি সহজেই ব্যবহারযোগ্য স্যুট । উদাহরণস্বরূপ, SHA256 কে হেক্স-স্ট্রিং হিসাবে একটি স্ট্রিং হ্যাশ করা আপনি সহজভাবে করতে পারেন:

final String hashed = Hashing.sha256()
        .hashString("your input", StandardCharsets.UTF_8)
        .toString();

85

স্ট্রিং টু স্ট্রিং হিসাবে সম্পূর্ণ উদাহরণ হ্যাশ another

public static String sha256(String base) {
    try{
        MessageDigest digest = MessageDigest.getInstance("SHA-256");
        byte[] hash = digest.digest(base.getBytes("UTF-8"));
        StringBuffer hexString = new StringBuffer();

        for (int i = 0; i < hash.length; i++) {
            String hex = Integer.toHexString(0xff & hash[i]);
            if(hex.length() == 1) hexString.append('0');
            hexString.append(hex);
        }

        return hexString.toString();
    } catch(Exception ex){
       throw new RuntimeException(ex);
    }
}

7
জনের ফলাফলগুলি হেক্স হিসাবে এনকোড করতে আপনার নিজের রোলিংয়ের পরিবর্তে অ্যাপাচি কমনের মতো বিদ্যমান লাইব্রেরিটি ব্যবহার করার বিষয়টি বিবেচনা করুন ।
লেইগ

1
স্ট্রিংবাফার কেন? (স্ট্রিংবিল্ডার নয়)? এবং স্ট্রিংবিল্ডারের ডিফল্ট আকার সেট করা আরও ভাল?
বোগদান

36
@ লেইহ: কিছু লোক কেবল পুরো লিবি নির্ভরতা যুক্ত করতে চান না কারণ তাদের এটির একটি একক ফাংশন প্রয়োজন যাতে আপনার নিজের ঘূর্ণায়মানটি কখনও কখনও একটি ভাল ধারণা।
ক্রিস

4
@ ক্রিস - সত্য এ কারণেই আমি এটি ব্যবহার করে "বিবেচনা করুন" বলেছিলাম ;-) বিদ্যমান লিবগুলি বিপুল পরিমাণে যুক্ত করতে পারে। ফ্লিপ দিকে তারা সাধারণত হোম স্পান কোডের চেয়ে বেশি পরীক্ষিত হয় এবং অবশ্যই সময় সাশ্রয় করে। তবে সবার জন্য এক-আকারের-ফিট-সব উত্তর নেই।
লে

1
আপনি গ্রন্থাগার থেকে উত্স কোডটি পড়তে পারেন এবং এর কোডটি অনুলিপি করতে পারেন!
ওলাভ গ্রানস জিজারে

47

আপনি জাভা 8 ব্যবহার করছেন আপনি এনকোড করতে byte[]করে

MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
String encoded = Base64.getEncoder().encodeToString(hash);

1
এই উপায়টি আমার পক্ষে সুবিধাজনক। যাইহোক, আপনার নীচের বেস 64.encodeToString (হ্যাশ, বেস 64.DEFAULT) ব্যবহার করা উচিত;
মোতাশেম জালাল

@ মোটাশেমজালাল বেস .৪। ডিএএফএলটি জাভা ৮ এর সর্বশেষ সংস্করণে পাওয়া যায় না, আমি বর্তমানে jdk1.8.0_144 ব্যবহার করছি, আপনি কীভাবে এটি তৈরি করেছেন আমাকে বলতে পারেন?
রাজাদিলিপকোলি

2
@ রাজাদিলিপকোলি আমি মনে করি এটি অ্যান্ড্রয়েড বাস্তবায়ন: বিকাশকারী.অ্যান্ড্রয়েড.
ডিবিএম

12
import java.security.MessageDigest;

public class CodeSnippets {

 public static String getSha256(String value) {
    try{
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(value.getBytes());
        return bytesToHex(md.digest());
    } catch(Exception ex){
        throw new RuntimeException(ex);
    }
 }
 private static String bytesToHex(byte[] bytes) {
    StringBuffer result = new StringBuffer();
    for (byte b : bytes) result.append(Integer.toString((b & 0xff) + 0x100, 16).substring(1));
    return result.toString();
 }
}

বিটওয়াইজ এবং -টি বাইট মান দিয়ে 0xffকী লাভ? এতে কিছুই পাওয়া যায় না?
yktoo

2
@yktoo: এটা একটি ধনাত্মক পূর্ণসংখ্যা থেকে পরিবর্তন করে (বাইটস জাভা সাইন ইন করেছেন, দুর্ভাগ্যবশত) stackoverflow.com/questions/11380062/...
leonbloy

স্ট্রিংবুফার একটি স্ট্রিংবিল্ডার দ্বারা প্রতিস্থাপিত হতে পারে
ব্যবহারকারীর 8461

10
String hashWith256(String textToHash) {
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] byteOfTextToHash = textToHash.getBytes(StandardCharsets.UTF_8);
    byte[] hashedByetArray = digest.digest(byteOfTextToHash);
    String encoded = Base64.getEncoder().encodeToString(hashedByetArray);
    return encoded;
}

7

আমি মাধ্যমে এ্যাপাচি কোড আঁকা DigestUtilsএবং sha256ফিরে ডিফল্ট বলে মনে হয় java.security.MessageDigestগণনা জন্য। অ্যাপাচি একটি স্বাধীন sha256সমাধান কার্যকর করে না । আমি java.securityলাইব্রেরির সাথে তুলনা করার জন্য একটি স্বাধীন বাস্তবায়ন খুঁজছিলাম । শুধুমাত্র এফওয়াইআই


3

কোটলিন ব্যবহার করে এটিই ছিল আমার পদ্ধতি:

private fun getHashFromEmailString(email : String) : String{
    val charset = Charsets.UTF_8
    val byteArray = email.toByteArray(charset)
    val digest = MessageDigest.getInstance("SHA-256")
    val hash = digest.digest(byteArray)

    return hash.fold("", { str, it -> str + "%02x".format(it)})
}

হাই, আমি কেবল আপনার কোডটি চেষ্টা করেছি কারণ অ্যান্ড্রয়েড স্টুডিওতে আমার একটি পাসওয়ার্ড হ্যাশ করা দরকার এবং আপনার কোডটি এ জাতীয় কিছু প্রদান করে: [B@188363eএনক্রিপ্ট করা পাসওয়ার্ড নয়। এছাড়াও, প্রতিটি সময় এই ফাংশনটি বলা হওয়ার পরে এটি আলাদা বলে মনে হয়।
অ্যাড্রিয়ান 2895

1
স্থির, আপনি ভুলে গিয়েছিলেন return hash.fold("", { str, it -> str + "%02x".format(it)})যা কোন এনক্রিপ্ট করা পাসওয়ার্ড দেয় এবং না কেবল বস্তুটি দেয়।
অ্যাড্রিয়ান 2895

1
হ্যাঁ আপনি ঠিক বলেছেন, আমাকে আপনার ঠিকঠাক সহ উত্তরটি আপডেট করুন। আপনাকে ধন্যবাদ :)
স্যামুয়েল লুস

2

ডাইজেস্টকে হেক্স স্ট্রিংয়ে রূপান্তর করার জন্য এখানে আরও কিছু সম্পাদনযোগ্য উপায়:

private static final char[] hexArray = "0123456789abcdef".toCharArray();

public static String getSHA256(String data) {
    StringBuilder sb = new StringBuilder();
    try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(data.getBytes());
        byte[] byteData = md.digest();
        sb.append(bytesToHex(byteData);
    } catch(Exception e) {
        e.printStackTrace();
    }
    return sb.toString();
}

private static String bytesToHex(byte[] bytes) {
    char[] hexChars = new char[bytes.length * 2];
    for ( int j = 0; j < bytes.length; j++ ) {
        int v = bytes[j] & 0xFF;
        hexChars[j * 2] = hexArray[v >>> 4];
        hexChars[j * 2 + 1] = hexArray[v & 0x0F];
    }
    return String.valueOf(hexChars);
}

কেউ কি জাভাতে দ্রুততর উপায় সম্পর্কে জানেন?


1

আপনি নিম্নলিখিত উপায়ে বার্তাডিজাস্ট ব্যবহার করতে পারেন:

public static String getSHA256(String data){
    StringBuffer sb = new StringBuffer();
    try{
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(data.getBytes());
        byte byteData[] = md.digest();

        for (int i = 0; i < byteData.length; i++) {
         sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
        }
    } catch(Exception e){
        e.printStackTrace();
    }
    return sb.toString();
}

1

জাভা 8 এ

import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Scanner;
import javax.xml.bind.DatatypeConverter;


Scanner scanner = new Scanner(System.in);
String password = scanner.nextLine();
scanner.close();

MessageDigest digest = null;
try {
    digest = MessageDigest.getInstance("SHA-256");
} catch (NoSuchAlgorithmException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}
byte[] hash = digest.digest(password.getBytes(StandardCharsets.UTF_8));
String encoded = DatatypeConverter.printHexBinary(hash);        
System.out.println(encoded.toLowerCase());

0

জাভাতে, ম্যাসেজডিজাস্ট ক্লাসটি ক্রিপ্টোগ্রাফিক হ্যাশিং মান গণনা করতে ব্যবহৃত হয়। এই শ্রেণিটি পাঠ্যের হ্যাশ মান খুঁজতে ক্রিপ্টোগ্রাফিক হ্যাশ ফাংশন ( MD5 , SHA-1 এবং SHA-256 ) সরবরাহ করে।

SHA-256 অ্যালগরিদম ব্যবহারের জন্য কোড উদাহরণ।

public void printHash(String str) throws NoSuchAlgorithmException {

MessageDigest md=MessageDigest.getInstance("SHA-256");

byte[] sha256=md.digest(str.getBytes(StandardCharsets.UTF_8));

   for(byte b : sha256){

      System.out.printf("%02x",b);

  }
}

0

আমি হ্যাশিংয়ের জন্য এটি ব্যবহার করছিলাম:

String pass = "password";

MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
byte hashBytes[] = messageDigest.digest(pass.getBytes(StandardCharsets.UTF_8));
BigInteger noHash = new BigInteger(1, hashBytes);
String hashStr = noHash.toString(16);

আউটপুট: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8


-2
private static String getMessageDigest(String message, String algorithm) {
 MessageDigest digest;
 try {
  digest = MessageDigest.getInstance(algorithm);
  byte data[] = digest.digest(message.getBytes("UTF-8"));
  return convertByteArrayToHexString(data);
 } catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
  // TODO Auto-generated catch block
  e.printStackTrace();
 }
 return null;
}

আপনি নীচের মত বিভিন্ন অ্যালগরিদমের সাথে উপরের পদ্ধতিতে কল করতে পারেন।

getMessageDigest(message, "MD5");
getMessageDigest(message, "SHA-256");
getMessageDigest(message, "SHA-1");

সম্পূর্ণ আবেদনের জন্য আপনি এই লিঙ্কটি উল্লেখ করতে পারেন ।

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