为什么Php pbkdf2输出与golang不同?

为什么Php pbkdf2输出与golang不同?,php,go,cryptography,pbkdf2,Php,Go,Cryptography,Pbkdf2,我花了几个小时想弄清楚这件事。我在PHP和golang中使用了相同的pbkdf2算法,但输出却有所不同 Golang saltString := "e7655f410aa38e1ca05de7a7fd8fb84c" password := "vibhor123" salt, err := hex.DecodeString(saltString) if err != nil { panic(err) } fmt.Println(salt) fmt.P

我花了几个小时想弄清楚这件事。我在PHP和golang中使用了相同的pbkdf2算法,但输出却有所不同

Golang

saltString := "e7655f410aa38e1ca05de7a7fd8fb84c"
password := "vibhor123"
salt, err := hex.DecodeString(saltString)
if err != nil {
    panic(err)
}
fmt.Println(salt)
fmt.Println(fmt.Sprintf("%x", pbkdf2.Key([]byte(input.Password), salt, 4096, sha256.Size, sha256.New)))
输出

3d70b8536a7b26d67419e220e1c244a1cc9431a3c23999c2f993d8a3a4dda13a
a8595b29ddb1a7819bae7e9d8809f26f053b3877197ed44e05e279459a826c64
PHP

$salt = "e7655f410aa38e1ca05de7a7fd8fb84c";
$password = "vibhor123";
echo(hash_pbkdf2("sha256", $password, $salt, 4096));
输出

3d70b8536a7b26d67419e220e1c244a1cc9431a3c23999c2f993d8a3a4dda13a
a8595b29ddb1a7819bae7e9d8809f26f053b3877197ed44e05e279459a826c64
根据我的理解,两者应该匹配。

PHP的salt必须以二进制字符串的形式表示,而不是十六进制字符串。只需使用
hex2bin
将其转换为原始二进制文件。看

$salt=“e7655f410aa38e1ca05de7a7fd8fb84c”;
$password=“vibhor123”;
echo(hash_pbkdf2(“sha256”),$password,hex2bin($salt),4096);

在PHP代码中,salt必须是十六进制解码的,即在
hash_pbkdf2
中,用
hex2bin($salt)
替换第三个参数。不过,Go代码不会输出该字符串。你的代码片段需要一个额外的
hex.EncodeToString()
@Topaco它工作了:)@blackgreen用我在输出中写的内容更新了它。