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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 06:47:23