当前位置: 首页 > 面试题库 >

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

南宫云
2023-03-14
问题内容

我在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™ 语言规