bcrypt生成哈希值错误,用户输入处理环节是否存在问题?
解决Go语言中bcrypt哈希生成与验证不匹配的问题
你猜的没错!问题确实出在换行符上。当你用bufio.Reader.ReadString('\n')读取标准输入时,返回的字符串会包含末尾的换行符(\n,Windows环境下还可能是\r\n),而在线工具生成哈希时是不会包含这个换行符的,这就导致两边的哈希值完全不一致,最终验证失败。
修复哈希生成代码
你需要在生成哈希前,把输入字符串末尾的换行符去掉。可以用strings.TrimSpace()来处理,它会去掉字符串首尾的所有空白字符(包括换行符、回车符、空格等),这样就能和在线工具的输入保持一致了。修改后的代码如下:
package main import ( "bufio" "fmt" "strings" "os" "golang.org/x/crypto/bcrypt" ) func main() { fmt.Println("Enter password:") reader := bufio.NewReader(os.Stdin) inputPassword, err := reader.ReadString('\n') if err != nil { fmt.Println("Failed to read input:", err) return } // 去掉首尾空白字符,包括换行符、回车符 trimmedPassword := strings.TrimSpace(inputPassword) inputPasswordBytes := []byte(trimmedPassword) hashBytes, err := bcrypt.GenerateFromPassword(inputPasswordBytes, bcrypt.DefaultCost) if err != nil { fmt.Println("Failed to generate hash:", err) return } hashStr := string(hashBytes) fmt.Println(hashStr) }
额外注意事项
- 别再忽略错误啦!你的原代码里直接用
_跳过了ReadString和GenerateFromPassword的错误返回,这在生产环境中很容易隐藏问题,建议加上基础的错误处理逻辑。 - 你的验证代码本身逻辑是没问题的,但要确保存储到配置文件的哈希值,是用处理后无换行符的密码生成的,这样验证时才能匹配成功。
另外,关于VS Code调试标准IO的问题,虽然没法单步调试,但你可以通过打印中间值来排查——比如用fmt.Printf("%q\n", inputPassword)输出原始输入字符串,这样就能看到隐藏的换行符了,也算一种简单有效的调试方式。
内容的提问来源于stack exchange,提问作者Dai
相关产品推荐
相关产品推荐

