2016-11-29 70 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