我在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
该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)
}
我正在创建一个用于处理用户输入的类。这样,在其他项目中,我可以从类中调用方法,而不必担心在每个新项目中创建扫描程序。 类中将有一个单独的方法来处理不同的变量类型(float、int、String等)。我从浮动类型开始: 这个方法工作得很好,只是它必须在else部分返回一个float。在本例中,它是一个零,因此当输入到计算器(例如)时,零会导致任何输出等于零。 有没有返回空浮点值的方法来克服这个问题
我有一个复合密钥的实体。订阅和源具有多对多的关系。 我正在使用Spring数据存储库来处理它。 当我尝试使用方法saveAll时,它会抛出 “com.mysql.jdbc.exceptions.jdbc4.mysqlsyntaxerrorexception:未知列'subscripti0_.subscription_id'” 同时尝试在保存后返回值。 Hibernate生成以下查询: 所以,现在我
作为一项自我分配的练习,我正在尝试编写一个简单的程序,该程序以生日为准,并确定给定日期所在的一周中的哪一天。计划的第一部分决定了年份。我使用扫描仪收集用户输入,然后使用do while循环测试输入是否可用(必须是数字,必须有四位数字),如果输入不符合标准,则重复该循环。我试图进入1998年,这显然是一个数字和四位数,它重复循环,好像我的输入是无效的。我假设do while循环中的某个地方有问题,但
我正在创建一个android应用程序,它需要一个到服务器的永久TCP连接。 我创建了一个服务,用于建立连接并侦听Inputstream上的传入字节(该服务在后台运行)。 前4个传入字节表示完整消息的消息长度。 在将完整的消息从Inputstream读入单独的缓冲区后,我想在分析消息的单独线程中调用另一个服务/异步任务。(服务应继续侦听更多传入消息)。 Android/Java中是否有一个现有的Me
我有一些代码,其中多个方法使用键盘,并在主方法中连续调用。我正在做的练习特别要求使用4种不同的方法,所以我不能把它们放在一起。最初,我用键盘。在每个方法的末尾关闭(),但当第二个方法运行时,无论调用顺序如何,这都会导致NoTouchElementException。通过卸下键盘。close(),代码现在可以工作了,但是我现在收到了资源泄漏的警告,因为键盘没有关闭。有人能告诉我一种关闭输入而不出错的
我想写一些这样的代码: 但是,javadoc不清楚应该使用哪个方法初始化,即哪个方法将生成: :“返回Java语言规范定义的基础类的标准名称。如果基础类没有标准名称(即,如果它是本地或匿名类,或者组件类型没有标准名称的数组),则返回null。” :“以字符串形式返回由该类对象表示的实体(类、接口、数组类、基元类型或void)的名称。如果该类对象表示的引用类型不是数组类型,则返回由Java™ 语言规