You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Golang模拟pbkdf2-scala密码哈希?校验返回-1问题排查

解决Go语言校验Scala生成的PBKDF2-SHA512密码哈希不匹配问题

问题核心原因:

  • Scala端的SecureHash生成密码哈希后,会将原始字节数组做Base64编码再存入数据库;而你的Go代码直接把pbkdf2.Key生成的原始字节数组,和数据库中Base64格式的字符串转成的字节数组对比,两者格式不匹配,导致返回-1。

解决步骤:

  1. 导入Go的encoding/base64包,用于解码数据库中的Base64哈希字符串
  2. 将数据库取出的哈希字符串解码为字节数组,再和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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 20:25:47