2014-06-27 9 views
5

Wenn ich den SHA-256-Hash in der Sprache "GO" generieren, bekomme ich ein anderes Byte-Array verglichen mit dem Java-Äquivalent.Go SHA-256-Hash unterscheidet sich von Java SHA-256-Hash

Dies ist die GO-Version:

fmt.Println(getSha256([]byte("5nonce=5"))) 

Das resultierende Array wie folgt aussieht:

41 79 186 235 199 123 95 226 16 59 51 161 112 245 192 50 21 66 180 250 179 109 153 18 233 148 16 237 156 69 163 150] 

Dies man das gleiche in Java-Code tun soll:

MessageDigest md = MessageDigest.getInstance("SHA-256"); 

md.update("5nonce=5".getBytes()); 
byte[] digest = md.digest(); 

Aber Ergebnisse in Dieses Byte-Array

[41, 79, -70, -21, -57, 123, 95, -30, 16, 59, 51, -95, 112, -11, -64, 50, 21, 66, -76, -6, -77, 109, -103, 18, -23, -108, 16, -19, -100, 69, -93, -106] 

Warum sind sie anders? Wie muss ich die Java-Version so ändern, dass sie genau wie die Go-Version funktioniert?

Antwort

17

Warum sind sie anders?

Sie sind nicht, wirklich. Sie sind die gleichen Bits. Es ist nur so, dass Java keine Bytes ohne Vorzeichen hat - also ist jedes Byte mit dem obersten gesetzten Bit negativ. In jedem Fall sehen Sie, dass Java result = Go result - 256.

Wenn Sie beide Byte-Arrays in hex oder base64 konvertieren, sehen Sie die gleichen Ergebnisse.

+0

Dank, sie konvertieren zu base64 es macht viel einfacher, sie zu vergleichen, und sie sind identisch identisch. – jan

4

Here is the Go code, die zum gleichen Ergebnis führen würde:

package main 

import "fmt" 
import "crypto/sha256" 

func main() { 
    sum224 := sha256.Sum256([]byte("5nonce=5")) 
    s := make([]int8, sha256.Size) 
    for i := range sum224 { 
     s[i] = int8(sum224[i]) 
    } 
    fmt.Printf("%d", s) 
} 

[41 79 -70 -21 -57 123 95 -30 16 59 51 -95 112 -11 -64 50 21 66 -76 -6 -77 109 -103 18 -23 -108 16 -19 -100 69 -93 -106] 

Die fmt doc nicht erwähnt:

Es gibt keine 'u' Flag. Ganzzahlen werden ohne Vorzeichen ohne Vorzeichen gedruckt.

Da Numeric Types definiert:

  • byte Alias ​​für uint8
  • uint8 die Menge aller unsigned 8-Bit-Integer (0 bis 255)
  • int8 die Menge aller signierten 8-bit Ganzzahlen (-128 bis 127)

Deshalb Sie müssten byte (unsigned) in signierte int8 konvertieren, um dasselbe zu sehen.


Wenn Sie Base64-Codierung (siehe golang playground) hinzufügen, können Sie das Ergebnis leichter vergleichen erhalten:

import "encoding/base64" 

res := base64.StdEncoding.EncodeToString([]byte(sum224[:])) 
fmt.Println(res) 

Das zurückgibt:

KU+668d7X+IQOzOhcPXAMhVCtPqzbZkS6ZQQ7ZxFo5Y= 
Verwandte Themen