zwei von drei Byte in sha256 Hash-Funktion

Ich verwende diese Funktion, um den SHA 256 zu berechnen

public static String getSHA1(String plainText) {
        MessageDigest md;
        try {
            md = MessageDigest.getInstance("SHA-256");

            md.update(plainText.getBytes(Charset.forName("UTF-8")));
            StringBuffer hexString = new StringBuffer();
            byte[] bytes = md.digest();
            for (int i = 0; i < bytes.length; i++) {
                hexString.append(Integer.toHexString(0xFF & bytes[i]));
            }
            return hexString.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

And to be sure of my results, I check this online website http://onlinemd5.com/

Die Ergebnisse zwischen meinem Code und dem Online sind fast identisch, aber Sie wissen, dass es gleich sein muss. zum Beispiel

mein einfacher Hoden:

1234567

das Ergebnis der Website

8BB0CF6EB9B17D0F7D22B456F121257DC1254E1F01665370476383EA776DF414

mein Codeergebnis

8bb0cf6eb9b17df7d22b456f121257dc1254e1f1665370476383ea776df414

und das sind mehr Beispiele:

7777777
8C1CDB9CB4DBAC6DBB6EBD118EC8F9523D22E4E4CB8CC9DF5F7E1E499BBA3C10
8c1cdb9cb4dbac6dbb6ebd118ec8f9523d22e4e4cb8cc9df5f7e1e499bba3c10


147258
7A2EC40FF8A1247C532309355F798A779E00ACFF579C63EEC3636FFB2902C1AC
7a2ec4ff8a1247c53239355f798a779e0acff579c63eec3636ffb292c1ac


888888
92925488B28AB12584AC8FCAA8A27A0F497B2C62940C8F4FBC8EF19EBC87C43E
92925488b28ab12584ac8fcaa8a27af497b2c6294c8f4fbc8ef19ebc87c43e

Ich weiß, dass dies vielleicht über die Codierung ist. aber schau, ich habe utf-8 verwendet, was die Website verwendet

0
Bitte verwenden Sie StringBuffer nicht, es sei denn, Sie haben es vor fast zehn Jahren durch StringBuilder ersetzt.
hinzugefügt der Autor Peter Lawrey, Quelle
hinzugefügt der Autor nrathaus, Quelle

1 Antworten

Das ist das Problem:

hexString.append(Integer.toHexString(0xFF & bytes[i]));

Dies führt dazu, dass alle führenden 0s verloren gehen - mit anderen Worten, jedes Byte, das kleiner als 16 ist, wird als eine einzelne hexadezimale Zahl anstelle von zwei ausgegeben.

Es gibt viele Korrekturen dafür. Beispielsweise:

  • Manually append 0 if the value is between 0 and 15 (ick)
  • Use String.format("%02x", bytes[i] & 0xff)
  • Use a full "byte array to hex conversion" method in a utility library (there are loads around)
0
hinzugefügt
@ user3110137: Wo verwenden Sie derzeit Integer.toHexString (...)
hinzugefügt der Autor Jon Skeet, Quelle
Sehr geehrter Herr Jon. Wo soll ich den String.format verwenden? Bitte. Danke für deine Antwort
hinzugefügt der Autor user3110137, Quelle