一尘不染

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

go

我在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
Code的Go语言工具和调试器不支持使用标准IO,因此我无法逐步调试程序:https : //github.com/Microsoft/vscode-
go/issues/219


阅读 224

收藏
2020-07-02

共1个答案

一尘不染

BUFIO
Reader.ReadString
方法向上返回数据并包括\n分隔符。将\n被包括在密码。使用string.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)
}
2020-07-02