Wie hash ich einen String mit SHA-256 in Java?

Lesezeit: 5 Minuten

Ivanas Benutzeravatar
Ivana

Wie kann ich etwas hashen? String mit SHA-256 auf Java?

  • mögliches Duplikat von Hash String über SHA-256 in Java

    – mmmmmm

    11. August 2014 um 12:25 Uhr

  • baeldung.com/sha-256-hashing-java

    – Bart

    31. März 2020 um 21:47 Uhr

Benutzeravatar von Jon Skeet
Jon Skeet

SHA-256 ist keine “Codierung” – es ist ein Einweg-Hash.

Sie würden die Zeichenfolge im Grunde in Bytes konvertieren (z. B. mit text.getBytes(StandardCharsets.UTF_8)) und dann die Bytes hashen. Beachten Sie, dass das Ergebnis des Hashs würde Auch beliebige Binärdaten sein, und wenn Sie das in einer Zeichenfolge darstellen möchten, sollten Sie base64 oder hex verwenden … nicht versuchen Sie, die zu verwenden String(byte[], String) Konstrukteur.

z.B

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

  • “SHA-256 ist keine Codierung” absolut richtig, aber ich muss sagen, ich bevorzuge den Titel der aktuellen Frage “wie man mit sha verschlüsselt” (viele scheinen zu denken, dass es sich um Verschlüsselung handelt). Vielleicht sollten wir es als Codierung behandeln und nicht als etwas, das mit Kryptografie zu tun hat, weil das in der Praxis eher der Art und Weise entspricht, wie es verwendet wird.

    – Luc

    10. Juni 2014 um 12:32 Uhr


  • @Luc: Nun, es ist ein kryptografischer Hash, also denke ich nicht, dass es unvernünftig ist, es zu sagen tut haben etwas mit Kryptographie zu tun … Verschlüsselung und Kryptographie sind nicht austauschbar …

    – Jon Skeet

    10. Juni 2014 um 12:34 Uhr

  • Hinweis: Es ist eine gute Idee zu verwenden StandardCharsets.UTF_8 anstelle von "UTF-8" Literal in Java 7+: Eine geprüfte Ausnahme weniger, um die man sich Sorgen machen muss.

    – kryger

    1. Dezember 2015 um 21:59 Uhr


  • Warum sollten Sie den String(byte[]String) Konstruktor beim Umgang mit dem Hash-Ergebnis?

    – Isaac van Bakel

    18. April 2016 um 13:03 Uhr

  • @IsaacvanBakel: Weil ein Hash ist nicht verschlüsselter Text. Es sind willkürliche Binärdaten.

    – Jon Skeet

    18. April 2016 um 13:04 Uhr

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

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

  • Beste Antwort, einfach zu bedienen, sauber. Vielen Dank!

    – fl0w

    16. Januar 2020 um 15:55 Uhr

Benutzeravatar von Jonathan
Jonathan

Eine andere Alternative ist Guave die eine einfach zu bedienende Suite von hat Hashing Dienstprogramme. Um beispielsweise einen String mit SHA256 als Hex-String zu hashen, würden Sie einfach Folgendes tun:

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

  • Nur zur Anmerkung – seit der Einführung in Version 11 ist es in Version 30 immer noch als @Beta gekennzeichnet.

    – m1ld

    6. August 2021 um 11:23 Uhr

Benutzeravatar von user1452273
Benutzer1452273

Vollständiger Beispiel-Hash als weitere Zeichenfolge.

public static String sha256(final String base) {
    try{
        final MessageDigest digest = MessageDigest.getInstance("SHA-256");
        final byte[] hash = digest.digest(base.getBytes("UTF-8"));
        final StringBuilder hexString = new StringBuilder();
        for (int i = 0; i < hash.length; i++) {
            final 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);
    }
}

Benutzeravatar von Eduardo Dennis
Eduard Dennis

Wenn Sie Java 8 verwenden, können Sie die byte[] durch tun

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

  • Dieser Weg ist bequem für mich. Sie sollten jedoch das folgende Base64.encodeToString(hash, Base64.DEFAULT) verwenden;

    – Motassem Dschalal

    27. Juni 2017 um 10:53 Uhr

  • @MotassemJalal Base64.DEFAULT ist in der neuesten Version von Java8 nicht verfügbar. Ich verwende derzeit jdk1.8.0_144. Können Sie mir bitte sagen, wie Sie es erstellt haben?

    – rajadilipkolli

    1. Dezember 2017 um 7:30 Uhr

  • @rajadilipkolli Ich denke, es ist die Android-Implementierung: developer.android.com/reference/android/util/Base64

    – dbm

    11. Juni 2018 um 19:33 Uhr

  • Aus irgendeinem Grund erhalte ich das falsche Ergebnis. Beispiel: Für die Eingabe von “test” bekam ich n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg= Anstatt von 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 . Woher?

    – Android-Entwickler

    14. März 2021 um 13:39 Uhr

  • Dies ist eine Möglichkeit, aber nicht der übliche Standard. @Android-Entwickler, deshalb sehen Sie hier einen anderen Wert als in anderen Implementierungen.

    – Durga Swaroop

    30. August 2021 um 11:10 Uhr


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

  • Dieser Weg ist bequem für mich. Sie sollten jedoch das folgende Base64.encodeToString(hash, Base64.DEFAULT) verwenden;

    – Motassem Dschalal

    27. Juni 2017 um 10:53 Uhr

  • @MotassemJalal Base64.DEFAULT ist in der neuesten Version von Java8 nicht verfügbar. Ich verwende derzeit jdk1.8.0_144. Können Sie mir bitte sagen, wie Sie es erstellt haben?

    – rajadilipkolli

    1. Dezember 2017 um 7:30 Uhr

  • @rajadilipkolli Ich denke, es ist die Android-Implementierung: developer.android.com/reference/android/util/Base64

    – dbm

    11. Juni 2018 um 19:33 Uhr

  • Aus irgendeinem Grund erhalte ich das falsche Ergebnis. Beispiel: Für die Eingabe von “test” bekam ich n4bQgYhMfWWaL+qgxVrQFaO/TxsrC4Is0V1sFbDwCgg= Anstatt von 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 . Woher?

    – Android-Entwickler

    14. März 2021 um 13:39 Uhr

  • Dies ist eine Möglichkeit, aber nicht der übliche Standard. @Android-Entwickler, deshalb sehen Sie hier einen anderen Wert als in anderen Implementierungen.

    – Durga Swaroop

    30. August 2021 um 11:10 Uhr


Benutzeravatar von Bagrat Kirakosian
Bagrat Kirakosian

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

1433650cookie-checkWie hash ich einen String mit SHA-256 in Java?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy