我在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请求的用户密码,并针对由以上代码生成的哈希进行测试,并将其保存到启动时加载的配置文件中,如下所示:
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-它说我生成的所有输出都不会与所需的密码匹配。
inputPassword
func main
我假设在进行字符编码或其他细节操作时出现了问题[]byte(inputPassword)-可能包括尾随行尾吗?
[]byte(inputPassword)
不幸的是,由于Visual Studio Code的Go语言工具和调试器不支持使用标准IO,因此我无法逐步调试程序:https : //github.com/Microsoft/vscode- go/issues/219
该BUFIO Reader.ReadString方法向上返回数据并包括\n分隔符。将\n被包括在密码。使用string.TrimSpace修剪\n用户可能输入的和。
\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) }