it-swarm.com.de

Wie man einen String mit sha256 in Java hasht?

Wie kann man einen String mit sha256 in Java? Kennt jemand eine kostenlose Bibliothek dafür?

179
Ivana

SHA-256 ist keine "Kodierung" - es ist ein Einweg-Hash.

Sie würden den String im Grunde genommen in Bytes konvertieren (z. B. mit text.getBytes(StandardCharsets.UTF_8)) und dann die Bytes hashen. Beachten Sie, dass das Ergebnis des Hashs auch beliebige Binärdaten sind. Wenn Sie dies in einer Zeichenfolge darstellen möchten, sollten Sie base64 oder hex ... nicht verwenden = versuche den String(byte[], String) Konstruktor zu benutzen.

z.B.

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

Ich denke, die einfachste Lösung ist Apache Common Codec :

String sha256hex = org.Apache.commons.codec.digest.DigestUtils.sha256Hex(stringText);   
149
seba

Eine andere Alternative ist Guava , das eine benutzerfreundliche Suite von Hashing Dienstprogrammen enthält. Wenn Sie beispielsweise eine Zeichenfolge mit SHA256 als Hex-Zeichenfolge hashen möchten, gehen Sie wie folgt vor:

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

Vollständiger Beispiel-Hash als eine andere Zeichenfolge zu Zeichenfolge.

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

Wenn Sie Java 8 verwenden, können Sie das byte[] indem Sie tun

MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(text.getBytes(StandardCharsets.UTF_8));
String encoded = Base64.getEncoder().encodeToString(hash);
36
Eduardo Dennis
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;
}
8
Ezd

Konvertiere Java String in Sha-256 Hash

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

Ich habe den Apache-Code durch DigestUtils verfolgt und sha256 Scheint zur Berechnung standardmäßig auf Java.security.MessageDigest Zurückgesetzt zu sein. Apache implementiert keine unabhängige sha256 - Lösung. Ich suchte nach einer unabhängigen Implementierung, um sie mit der Bibliothek Java.security Zu vergleichen. Nur zu Ihrer Information.

5
garyn

Hier ist eine etwas performantere Möglichkeit, den Digest in einen Hex-String umzuwandeln:

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

Kennt jemand einen schnelleren Weg in Java?

2
andi

Sie können MessageDigest folgendermaßen verwenden:

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
thatman

Dies war mein Ansatz mit Kotlin:

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.toString()
}
0
Samuel Luís