SHA-256 ist keine "Codierung" - es ist ein Einweg-Hash.
Sie würden den String grundsätzlich in Bytes konvertieren (z. B. using 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 verwenden. Versuchen Sie nicht , den String(byte[], String)Konstruktor zu verwenden.
"SHA-256 ist keine Kodierung" ist absolut richtig, aber ich muss sagen, ich ziehe den Titel der aktuellen Frage dem "Verschlüsseln mit sha" vor (viele scheinen zu glauben, dass es sich um eine Verschlüsselung handelt). Vielleicht sollten wir es als Codierung behandeln, anstatt etwas mit Kryptografie zu tun zu haben, da dies in der Praxis näher an der Verwendung liegt.
Luc
5
@Luc: Nun , es ist ein kryptographischer Hash, also denke ich nicht , dass es unvernünftig ist , zu sagen , es ist etwas mit Kryptographie ... Verschlüsselung und Kryptographie zu tun hat , sind nicht austauschbar ...
Jon Skeet
8
Hinweis: Es ist eine gute Idee, StandardCharsets.UTF_8 anstelle des "UTF-8"Literal in Java 7+ zu verwenden: Eine aktivierte Ausnahme ist weniger wichtig.
Kryger
3
Warum sollten Sie den Konstruktor String (byte [], String) vermeiden, wenn Sie mit dem Hash-Ergebnis arbeiten?
Isaac van Bakel
5
@IsaacvanBakel: Weil ein Hash kein codierter Text ist. Es sind beliebige Binärdaten.
Beste Antwort, einfach zu bedienen, sauber. Danke dir!
fl0w
99
Eine weitere Alternative ist Guava mit einer benutzerfreundlichen Suite von Hashing- Dienstprogrammen. Um beispielsweise einen String mit SHA256 als Hex-String zu hashen, gehen Sie einfach wie folgt vor:
Um Jons Ergebnisse als Hex zu codieren, sollten Sie eine vorhandene Bibliothek wie Apache Commons verwenden, anstatt Ihre eigene zu rollen.
Leigh
1
Warum StringBuffer? (kein stringBuilder)? und vielleicht wäre es besser, die Standardgröße des Stringbuilders festzulegen?
Bogdan
36
@Leigh: Einige Leute möchten keine ganze lib-Abhängigkeit hinzufügen, nur weil sie eine einzige Funktion davon benötigen, so dass es manchmal eine gute Idee ist, eine eigene zu rollen.
Chris
4
@ Chris - Stimmt. Deshalb habe ich "erwägen", es zu verwenden ;-) Bestehende Bibliotheken können Bulk hinzufügen. Auf der anderen Seite sind sie normalerweise besser getestet als selbst gesponnener Code und sparen natürlich Zeit. Aber es gibt keine einheitliche Antwort für alle.
Leigh
1
Sie können auch den Quellcode aus der Bibliothek lesen und den Code kopieren!
Olav Grønås Gjerde
47
Wenn Sie Java 8 verwenden, können Sie das byte[]durch Codieren codieren
Dieser Weg ist bequem für mich. Sie sollten jedoch den folgenden Base64.encodeToString (Hash, Base64.DEFAULT) verwenden.
Motassem Jalal
@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 mitteilen, wie Sie es erstellt haben?
Ich habe den Apache-Code durchverfolgt DigestUtilsund sha256scheint java.security.MessageDigestfür die Berechnung standardmäßig auf zurück zu gehen . Apache implementiert keine unabhängige sha256Lösung. Ich suchte nach einer unabhängigen Implementierung, um sie mit der java.securityBibliothek zu vergleichen . Nur zu Ihrer Information.
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)})}
Hallo, ich habe gerade Ihren Code ausprobiert, weil ich in Android Studio ein Passwort hashen muss und Ihr Code ungefähr so zurückgibt: [B@188363enicht das verschlüsselte Passwort. Außerdem scheint es jedes Mal anders zu sein, wenn diese Funktion aufgerufen wird.
Adrian2895
1
Behoben, du hast vergessen, return hash.fold("", { str, it -> str + "%02x".format(it)})welches das verschlüsselte Passwort und nicht das Objekt selbst zurückgibt.
Adrian2895
1
Ja, Sie haben Recht, lassen Sie mich die Antwort mit Ihrem Fix aktualisieren. Vielen Dank :)
Samuel Luís
2
Hier ist eine etwas performantere Möglichkeit, den Digest in eine Hex-Zeichenfolge umzuwandeln:
In Java wird die MessageDigest- Klasse verwendet, um den kryptografischen Hashing-Wert zu berechnen. Diese Klasse bietet eine kryptografische Hash-Funktion ( MD5 , SHA-1 und SHA-256 ), um den Hash-Wert von Text zu ermitteln.
Codebeispiel für die Verwendung des SHA-256-Algorithmus.
publicvoid printHash(String str)throwsNoSuchAlgorithmException{MessageDigest md=MessageDigest.getInstance("SHA-256");byte[] sha256=md.digest(str.getBytes(StandardCharsets.UTF_8));for(byte b : sha256){System.out.printf("%02x",b);}}
Antworten:
SHA-256 ist keine "Codierung" - es ist ein Einweg-Hash.
Sie würden den String grundsätzlich in Bytes konvertieren (z. B. using
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 verwenden. Versuchen Sie nicht , denString(byte[], String)
Konstruktor zu verwenden.z.B
quelle
"UTF-8"
Literal in Java 7+ zu verwenden: Eine aktivierte Ausnahme ist weniger wichtig.Ich denke, dass die einfachste Lösung die Verwendung von Apache Common Codec ist :
quelle
Eine weitere Alternative ist Guava mit einer benutzerfreundlichen Suite von Hashing- Dienstprogrammen. Um beispielsweise einen String mit SHA256 als Hex-String zu hashen, gehen Sie einfach wie folgt vor:
quelle
Vollständiges Beispiel für einen Hash als weiteren String.
quelle
Wenn Sie Java 8 verwenden, können Sie das
byte[]
durch Codieren codierenquelle
quelle
0xff
? Es gibt nichts, oder?quelle
Ich habe den Apache-Code durchverfolgt
DigestUtils
undsha256
scheintjava.security.MessageDigest
für die Berechnung standardmäßig auf zurück zu gehen . Apache implementiert keine unabhängigesha256
Lösung. Ich suchte nach einer unabhängigen Implementierung, um sie mit derjava.security
Bibliothek zu vergleichen . Nur zu Ihrer Information.quelle
Dies war mein Ansatz mit Kotlin:
quelle
[B@188363e
nicht das verschlüsselte Passwort. Außerdem scheint es jedes Mal anders zu sein, wenn diese Funktion aufgerufen wird.return hash.fold("", { str, it -> str + "%02x".format(it)})
welches das verschlüsselte Passwort und nicht das Objekt selbst zurückgibt.Hier ist eine etwas performantere Möglichkeit, den Digest in eine Hex-Zeichenfolge umzuwandeln:
Kennt jemand einen schnelleren Weg in Java?
quelle
Sie können MessageDigest folgendermaßen verwenden:
quelle
In Java 8
quelle
In Java wird die MessageDigest- Klasse verwendet, um den kryptografischen Hashing-Wert zu berechnen. Diese Klasse bietet eine kryptografische Hash-Funktion ( MD5 , SHA-1 und SHA-256 ), um den Hash-Wert von Text zu ermitteln.
Codebeispiel für die Verwendung des SHA-256-Algorithmus.
quelle
Dies ist, was ich für das Hashing verwendet wurde:
Ausgabe: 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
quelle
Sie können die obige Methode mit verschiedenen Algorithmen wie unten aufrufen.
Sie können diesen Link für die vollständige Anwendung verweisen .
quelle