如何用Golang模拟pbkdf2-scala密码哈希?校验返回-1问题排查
解决Go语言校验Scala生成的PBKDF2-SHA512密码哈希不匹配问题
问题核心原因:
- Scala端的
SecureHash生成密码哈希后,会将原始字节数组做Base64编码再存入数据库;而你的Go代码直接把pbkdf2.Key生成的原始字节数组,和数据库中Base64格式的字符串转成的字节数组对比,两者格式不匹配,导致返回-1。
解决步骤:
- 导入Go的
encoding/base64包,用于解码数据库中的Base64哈希字符串 - 将数据库取出的哈希字符串解码为字节数组,再和Go生成的密钥字节数组对比
修改后的完整代码:
package main import ( "bytes" "crypto/sha512" "encoding/base64" "fmt" "golang.org/x/crypto/pbkdf2" "strings" ) func main() { iteration := 25000 // 生成输入密码的哈希字节数组 password := []byte("123") salt := "yCyQMMMBt1TuPa1F9FeKfT0yrNIF8tLB" key := pbkdf2.Key(password, []byte(salt), iteration, sha512.Size, sha512.New) // 解析数据库中的哈希字符串 tokenS := strings.Split("$pbkdf2-sha512$25000$yCyQMMMBt1TuPa1F9FeKfT0yrNIF8tLB$TtQt5BZLs4qlA0YAkcGukZwu7pkxOLcxwuoQB3qNtxM", "$") passwordHashInDatabase := tokenS[4] // 解码Base64格式的哈希字符串 dbHashBytes, err := base64.StdEncoding.DecodeString(passwordHashInDatabase) if err != nil { fmt.Println("解码哈希失败:", err) return } // 对比两个字节数组 out := bytes.Compare(key, dbHashBytes) fmt.Println("out: ", out) // 正确匹配时返回0 }
额外验证点:
- 迭代次数(25000)、哈希算法(SHA512)和Scala端
SecureHash的默认配置一致,无需调整 - 盐值完全匹配数据库中的记录,确保没有拼写错误
内容的提问来源于stack exchange,提问作者Alireza
相关产品推荐
相关产品推荐

