代码之家  ›  专栏  ›  技术社区  ›  Dai

bcrypt生成不正确的哈希-我的用户输入处理是否正确?

  •  0
  • Dai  · 技术社区  · 6 年前

    我在Go中编写了一个简短的程序,从stdin提供的密码生成bcrypt密码哈希。下面的最小示例:

    package main
    
    import (
        "bufio"
        "fmt"
        "golang.org/x/crypto/bcrypt"
    )
    
    func main() {
    
        fmt.Println("Enter password:")
        reader := bufio.NewReader(os.Stdin)
        inputPassword, _ := reader.ReadString('\n')
    
        inputPasswordBytes := []byte(inputPassword)
        hashBytes, _ := bcrypt.GenerateFromPassword(inputPasswordBytes, bcrypt.DefaultCost)
    
        hashStr := string(hashBytes)
    
        fmt.Println(hashStr)
    }
    

    在另一个程序(Go web服务器)中,我接受来自HTTP的用户密码 POST 根据使用上述代码生成并保存到启动时加载的配置文件中的哈希进行请求和测试,如下所示:

    func authenticateHashedPassword(inputPassword string) bool {
    
        configPasswordHashBytes := []byte(server.Config.Net.Auth.Password)
        inputPasswordBytes := []byte(inputPassword)
        err := bcrypt.CompareHashAndPassword(configPasswordHashBytes, inputPasswordBytes)
        if err != nil {
            return false
        }
        return true
    
    }
    

    然而,当我知道 inputPassword 是正确的。经过调查我发现 func main 当我使用此网站测试我的值时,上面生成了错误的输出: https://www.dailycred.com/article/bcrypt-calculator -它说我生成的所有输出都与所需的密码不匹配。

    我假设当我这样做时,字符编码或其他细节出现了问题 []byte(inputPassword) -它是否可能包括尾随线结束?

    很遗憾,我无法单步调试我的程序,因为Visual Studio代码的Go语言工具和调试器不支持使用标准IO: https://github.com/Microsoft/vscode-go/issues/219

    1 回复  |  直到 6 年前
        1
  •  3
  •   Cerise Limón    6 年前

    这个 bufio Reader.ReadString 方法返回的数据包括 \n 分隔符。这个 \n个 包含在密码中。使用 strings.TrimSpace 要修剪 \n个 以及用户可能输入的任何空白。

    package main
    
    import (
        "bufio"
        "fmt"
        "golang.org/x/crypto/bcrypt"
    )
    
    func main() {
    
        fmt.Println("Enter password:")
        reader := bufio.NewReader(os.Stdin)
        inputPassword, _ := strings.TrimSpace(reader.ReadString('\n'), "\n"))
    
        inputPasswordBytes := []byte(inputPassword)
        hashed, _ := bcrypt.GenerateFromPassword(inputPasswordBytes, bcrypt.DefaultCost)
    
        fmt.Printf("%s\n", hashed)
    }