Ich lese SHA-256 aus einem Buch, aber das Buch erklärt nicht, wofür es ist? Das Buch erklärt, wie man es in Java erstellt. Allerdings habe ich nicht verstanden, was Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1))
ist. Kann mir das jemand im Detail erklären?Für was ist SHA-256? Und wie erstelle ich es in Java?
Antwort
Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1))
ist eine wa y des Konvertierens eines Bytewerts in eine Zeichenfolge, die genau zwei Zeichen breit ist und den hexadezimalen Wert des Bytes anzeigt. Ein Blick auf String's Javadoc page wird helfen.
Die Kombination von 0x100
substring(1)
und stellt sicher, dass Bytewerte < als 16 dezimal (das heißt, 0 bis F in hex) wird auch als zwei Zeichen dargestellt.
By the way:
String.format("%02x",byteData[i])
tut genau das gleiche, und vielleicht besser lesbar, vor allem von den Menschen in Betracht gezogen werden, die in C printf Stil Format-Strings verwendet werden.
Schließlich, warum (byteData[i] & 0xff)
? Siehe here für eine ausführliche Erklärung:
Es funktioniert, weil Java eine erweiternde Konvertierung wird durchführen, um zu int, mit Vorzeichenerweiterung, so dass anstelle eines negativen Byte erhalten Sie einen negativen int haben. Das Maskieren mit 0xff lässt nur die unteren 8 Bits übrig, was die Zahl wieder positiv macht (und was Sie ursprünglich beabsichtigten).
Könnten Sie ein Beispiel für die Umwandlung eines Bytes in ein Hexadezimal geben? –
Das ist genau das, was sowohl der "Integer.toString" als auch mein "String.format" Vorschlag tun, also verstehe ich deine Frage nicht? – fvu
Jetzt verstehe ich, wie man es in Hexadezimal konvertieren, aber ich habe noch eine Frage. ist & 0xff wichtig? ist das Byte nicht immer gleich 8 Bits? Warum müssen wir also sicherstellen, dass es 8 Bits sind? Vielen Dank! –
SHA-256 ist ein Hash-Algorithmus genannt wird, und ihr Zweck ist einfach: es nimmt alle Daten und erzeugt eine einzigartige Serie von Bytes es darzustellen. Es gibt keine Möglichkeit, diesen Prozess umzukehren, und es gibt keine bekannten Fälle, in denen ein SHA-256-Hash nicht eindeutig ist.
Der Zweck der betroffenen Codezeile besteht darin, ein Zeichen der endgültigen SHA-256-Ausgabe zu generieren. Java gibt Ihnen die has in rohen Daten (ein Byte-Array) und wir konvertieren es normalerweise in hexadezimale, um es als eine Zeichenfolge darzustellen. Diese Codezeile ist ziemlich komplex, also gehe ich einzeln darauf ein, was jeder Teil davon macht.
sb.append();
nimmt die Eingabe und fügt sie dem in einem StringBuilder gespeicherten Ergebnis hinzu.
Integer.toString();
nimmt eine Nummer und stellt es als Zeichenkette
byteData[i] & 0xff
das aktuelle Byte von Hash-Daten auswählt und verwendet die bitweise und Betrieb 0xFF verwendet (so für jedes Bit in dem Byte, wenn das entsprechende Bit in 0xFF gleich ist, ist der Ausgang eine 1 ist, wenn nicht der Ausgang eine 0
ist string.substring(1);
gibt die Zeichenkette nach dem ersten Zeichen beginnen.
Ihre Antwort ist auch gut, aber Sie haben nicht erklärt, wofür "0x100" ist. Ich schätze Ihre Hilfe. –
https://en.wikipedia.org/wiki/Cryptographic_hash_function#Applications –
SHA-256 bezieht sich nicht auf die Konvertierung einer Zahl in Hexadezimal. –
SHA 256 ist ein Hash-Algorithmus. Aber im Ernst: wenn du keine Ahnung hast, worum es geht; Vergiss es zu benutzen. Normalerweise benötigen Sie Hashing und Kryptografie, um ein gewisses Maß an "Sicherheit" zu erreichen. Aber das ist kein Thema für Anfänger. Mit anderen Worten: Wenn Sie solche Fragen zu solchen Themen stellen, bedeutet dies, dass Sie besser nach anderen Themen Ausschau halten sollten. – GhostCat