2017-07-27 4 views
4

Ich versuche, eine Base64-codierte SHA1-Hash in gehen zu bauen, aber das Ergebnis i immer bin, ist sehr unterschiedlich zu den Ergebnissen anderer ProgrammiersprachenSHA1 anders geht als in Python und openssl

package main 

import (
    "crypto/sha1" 
    "encoding/base64" 
    "fmt" 
) 

func main() { 
    c := sha1.New() 
    input := []byte("hello") 
    myBytes := c.Sum(input) 
    fmt.Println(base64.StdEncoding.EncodeToString(base64.StdPadding)) 
} 

Dieser Go-Code out Drucke aGVsbG/aOaPuXmtLDTJVv++VYBiQr9gHCQ==

Mein Python-Code sieht wie folgt aus

import hashlib 
import base64 


print(base64.b64encode(hashlib.sha1('hello').digest())) 

und Ausgänge qvTGHdzF6KLavt4PO0gs2a6pQ00=

zum Vergleich My bash Befehl sieht wie folgen aus

echo -n hello| openssl dgst -sha1 -binary |base64 

und gibt diesen qvTGHdzF6KLavt4PO0gs2a6pQ00=

Was ich, dass der Code Python vermuten läßt ist alles in Ordnung zu tun. Aber warum druckt Go ein anderes Ergebnis. Wo ist mein Fehler?

Thnx im Voraus

Antwort

3

Es gibt eine example, wie man es richtig verwendet. Sie tun sollten:

c := sha1.New() 
io.WriteString(c, "hello") 
myBytes := c.Sum(nil) 
fmt.Println(base64.StdEncoding.EncodeToString(myBytes)) 

https://play.golang.org/p/sELsWTcrdd

+0

awesome! Ja, ein dummer Fehler von mir. Aber thnx für deine schnelle Antwort.Ich werde Ihre Antwort als richtig markieren – minzchickenflavor

10

Sie verwenden den Standard-lib in einem völlig falschen Weg. Gehen Sie nicht davon aus, was eine Methode/Funktion tut, lesen Sie immer die Dokumentation, wenn sie für Sie neu ist.

sha1.New() gibt hash.Hash zurück. Seine Methode ist nicht, um den Hash-Wert zu berechnen, aber um das aktuelle Hash-Ergebnis zu erhalten, ändert es nicht den zugrunde liegenden Hash-Status.

hash.Hash implementiert io.Writer, und um den Hash einiger Daten zu berechnen, müssen Sie diese Daten in sie schreiben. Hash.Sum() nimmt ein optionales Slice, wenn Sie bereits einen zugewiesen haben, um das Ergebnis (den Hash) darauf zu schreiben. Übergeben Sie nil, wenn Sie möchten, dass ein neues zugewiesen wird.

Auch base64.StdEncoding.EncodeToString() erwartet die Byte-Daten (Byte-Slice), die Sie in Base64 konvertieren möchten, also müssen Sie die Prüfsummen-Daten an es übergeben. In Ihrem Code haben Sie nicht gesagt, EncodeToString() was zu verschlüsseln.

Arbeitsbeispiel:

c := sha1.New() 
input := []byte("hello") 
c.Write(input) 
sum := c.Sum(nil) 
fmt.Println(base64.StdEncoding.EncodeToString(sum)) 

Die Ausgabe wird wie erwartet (versuchen Sie es auf dem Go Playground):

qvTGHdzF6KLavt4PO0gs2a6pQ00= 

Beachten Sie, dass die crypto/sha1 Paket auch eine praktische sha1.Sum() Funktion hat, die dies tut in einem Schritt :

input := []byte("hello") 
sum := sha1.Sum(input) 
fmt.Println(base64.StdEncoding.EncodeToString(sum[:])) 

Ausgabe ist dasselbe. Probieren Sie es auf der Go Playground.