जावा में sha256 के साथ कुछ स्ट्रिंग कैसे करें?


210

मैं sha256जावा में कुछ स्ट्रिंग कैसे कर सकता हूं ? क्या किसी को इसके लिए किसी भी मुफ्त पुस्तकालय का पता है?



जवाबों:


308

SHA-256 एक "एन्कोडिंग" नहीं है - यह एक तरफ़ा हैश है।

आप मूल रूप से स्ट्रिंग को बाइट्स में परिवर्तित करेंगे (उदाहरण के लिए text.getBytes(StandardCharsets.UTF_8)) और फिर बाइट को हैश में। ध्यान दें कि हैश का परिणाम भी मनमाना द्विआधारी डेटा होगा, और यदि आप एक स्ट्रिंग में यह प्रतिनिधित्व करना चाहते हैं, तो आपको बेस 64 या हेक्स का उपयोग करना चाहिए ... कंस्ट्रक्टर का उपयोग करने का प्रयास करें String(byte[], String)

जैसे

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

18
"SHA-256 एक एन्कोडिंग नहीं है" बिल्कुल सही है, लेकिन मुझे कहना होगा कि मैं वर्तमान प्रश्न के शीर्षक को "शा के साथ एन्क्रिप्ट कैसे करें" पसंद करते हैं (बहुत से लगता है कि यह एन्क्रिप्शन है)। शायद हमें क्रिप्टोग्राफी के साथ कुछ करने के बजाय इसे एन्कोडिंग के रूप में व्यवहार करना चाहिए क्योंकि व्यवहार में यह कैसे उपयोग किया जाता है, इसके करीब है।
ल्यूक

5
: @Luc खैर यह एक क्रिप्टोग्राफिक हैश है तो मैं यह है कि यह कहना अनुचित है नहीं लगता है है के साथ क्रिप्टोग्राफी ... एन्क्रिप्शन और क्रिप्टोग्राफी करने के लिए परस्पर विनिमय नहीं कर रहे हैं कुछ है ...
जॉन स्कीट

8
नोट: जावा 7+ में शाब्दिक के बजाय StandardCharsets.UTF_8 का उपयोग करना एक अच्छा विचार है "UTF-8": एक चिंता के बारे में कम किए गए अपवाद की जाँच की।
21

3
हैश परिणाम से निपटने के दौरान आपको स्ट्रिंग (बाइट [], स्ट्रिंग) निर्माता से क्यों बचना चाहिए?
इसहाक वैन बेकल

5
@IsaacvanBakel: क्योंकि कोई हैश टेक्स्ट इनकोडिंग नहीं है । यह मनमाना बाइनरी डेटा है।
जॉन स्कीट

172

मुझे लगता है कि Apache Common Codec का उपयोग करना सबसे आसान उपाय है :

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

एक और स्ट्रिंग के रूप में स्ट्रिंग के लिए पूर्ण उदाहरण हैश।

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
@Leigh: कुछ लोग न केवल एक संपूर्ण कार्य-निर्भरता जोड़ना चाहते हैं, क्योंकि उन्हें इसके एक ही कार्य की आवश्यकता होती है, इसलिए अपना स्वयं का रोल करना कभी-कभी एक अच्छा विचार होता है।
क्रिस

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
यह रास्ता मेरे लिए सुविधाजनक है। हालाँकि, आपको निम्नलिखित Base64.encodeToString (हैश, Base64.DEFAULT) का उपयोग करना चाहिए;
मोतीसेम जलाल

@MotassemJalal Base64.DEFAULT Java8 के नवीनतम संस्करण में उपलब्ध नहीं है, मैं वर्तमान में jdk1.8.0_144 का उपयोग कर रहा हूं, क्या आप मुझे बता सकते हैं कि आपने इसे कैसे बनाया है?
राजादिलिपकोली

2
@rajadilipkolli मुझे लगता है कि यह Android कार्यान्वयन है: developer.android.com/reference/android/util/Base64
dbm

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

StringBuffer एक StringBuilder द्वारा प्रतिस्थापित किया जा सकता है
User8461

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पुस्तकालय के खिलाफ तुलना करने के लिए एक स्वतंत्र कार्यान्वयन की तलाश में था । केवल FYI करें।


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एन्क्रिप्टेड पासवर्ड नहीं। साथ ही, ऐसा लगता है कि हर बार यह फ़ंक्शन कहा जाता है।
Adrian2895

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

आप निम्न तरीके से MessageDigest का उपयोग कर सकते हैं:

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

Java में, MessageDigest वर्ग का उपयोग क्रिप्टोग्राफ़िक हैशिंग मूल्य की गणना करने के लिए किया जाता है। यह वर्ग क्रिप्टोग्राफिक हैश फ़ंक्शन ( 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");

आप पूर्ण आवेदन के लिए इस लिंक का उल्लेख कर सकते हैं ।

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