2016-11-29 9 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.StdEncoding.EncodeToString(container) 

digest := base64.URLEncoding.EncodeToString(container) 

を交換し、それがPHPと同じ結果を出す:https://play.golang.org/p/6pHCN6rb9U

+0

ありがとう、それは問題を解決しました。 – PumpkinSeed

関連する問題