2016-11-29 72 views
4

我想在Golang中實現Symfony密碼哈希。結果是相同的期望一些字符。PHP和Golang sha512不同的結果

symfony的溶液:

function mergePasswordAndSalt($password, $salt) 
{ 
    return $password.'{'.$salt.'}'; 
} 

$salted = mergePasswordAndSalt('asd12345', 'korsipcidz4w84kk0cccwo840s8s4sg'); 
$digest = hash('sha512', $salted, true); 


for ($i = 1; $i < 5000; ++$i) { 
    $new = $digest.$salted; 
    $digest = hash('sha512', $new, true); 
} 

echo base64_encode($digest); 

的Golang溶液:

package main 

import (
    "crypto/sha512" 
    "encoding/base64" 
    "fmt" 
    "hash" 
) 

var (
    hasher hash.Hash 
    container []byte 
) 

func main() { 
    password := "asd12345" 
    salt := "korsipcidz4w84kk0cccwo840s8s4sg" 
    salted := []byte(password + "{" + salt + "}") 

    hasher = sha512.New() 
    hasher.Write(salted) 
    container = hasher.Sum(nil) 

    for i := 1; i < 5000; i++ { 
     new := append(container[:], salted[:]...) 

     hasher = sha512.New() 
     hasher.Write(new) 
     container = hasher.Sum(nil) 
    } 
    digest := base64.URLEncoding.EncodeToString(container) 
    fmt.Println(digest) 
} 

的Golang結果:

yIp0074qTaxBz7fOGFpTVYU7LaAterUko6YjnmCZ55R6lAYouXWFoBKT_wI7Vit87RKbU9I-U3M2mU11v_KEUQ== 

PHP的結果:

yIp0074qTaxBz7fOGFpTVYU7LaAterUko6YjnmCZ55R6lAYouXWFoBKT/wI7Vit87RKbU9I+U3M2mU11v/KEUQ== 

那麼如何顯示示例,它是相同的只是其他字符lik - ,/,+是不同的。我認爲這可能是因爲字符編碼,但我不知道,我怎麼能確定它。 環境:Fedora 23,Go 1.7,PHP 5.6

回答

4

您正在使用URLEncoding,而PHP似乎使用標準編碼。更換

digest := base64.URLEncoding.EncodeToString(container) 

digest := base64.StdEncoding.EncodeToString(container) 

,併發出了相同的結果,因爲PHP:https://play.golang.org/p/6pHCN6rb9U

+0

謝謝,它解決了這個問題。 – PumpkinSeed