2013-04-19 14 views
5

Ich versuche, eine SHA256 Hash-Zeichenfolge über HTTP an einen Server zu senden, wo ich authentifizieren möchte, indem Sie einen SHA256-Hash durchführen und die beiden übereinstimmen. Zu Testzwecken verwende ich die gleiche Zeichenfolge, aber meine Ergebnisse stimmen nicht überein. Könnte dies etwas mit Standardcodierungsschemas für meine base64_encode-Aufrufe sein? Vielen Dank.SHA256 in Go und PHP geben unterschiedliche Ergebnisse

In PHP ich tue:

$sha = hash("sha256", $url, true); 
$sha = base64_encode(urlencode($sha)); 

Und in Go Ich mache

//convert string to byte slice 
converted := []byte(to_hash) 

//hash the byte slice and return the resulting string 
hasher := sha256.New() 
hasher.Write(converted) 
return (base64.URLEncoding.EncodeToString(hasher.Sum(nil))) 
+1

stellen Sie sicher, die beiden Strings absolut identisch sind, bevor Sie sie anfangen zu arbeiten. Sie könnten ein verstecktes Zeichen (Zeilenumbruch, Leerzeichen, Tab usw.) am Ende einer der Sprachen haben, was den Hash-Wert komplett verändern würde. –

+0

Stellen Sie sicher, dass Sie dieselbe Zeichenfolgencodierung verwenden. – SLaks

+0

Ich benutze das Wort "Test" auf beiden Seiten fest programmiert, nur um sicher zu gehen, immer noch nicht funktioniert. – user387049

Antwort

6

Ich konnte es nach einer Weile, um herauszufinden. Ich standardisierte beide auf hexadezimale Codierung. Um dies zu erreichen ich den Code wie folgt verändert:

PHP:

$sha = hash("sha256", $url, false); //false is default and returns hex 
//$sha = base64_encode(urlencode($sha)); //removed 

Go:

//convert string to byte slice 
converted := []byte(to_hash) 

//hash the byte slice and return the resulting string 
hasher := sha256.New() 
hasher.Write(converted) 
return (hex.EncodeToString(hasher.Sum(nil))) //changed to hex and removed URLEncoding