我在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