Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
crypto/bcrypt:hashedPassword不是给定密码的哈希_Hash_Go_Bcrypt - Fatal编程技术网

crypto/bcrypt:hashedPassword不是给定密码的哈希

crypto/bcrypt:hashedPassword不是给定密码的哈希,hash,go,bcrypt,Hash,Go,Bcrypt,我加密用户的密码并保存到数据库。然后对于用户登录,比较哈希密码和普通密码,我得到的是crypto/bcrypt:hashedPassword不是给定密码的哈希值错误。怎么了 func encryptPassword(password string) (string, error) { bytePass := []byte(password) hashedPassword, err := bcrypt.GenerateFromPassword(bytePass, bcrypt.De

我加密用户的密码并保存到数据库。然后对于用户登录,比较哈希密码和普通密码,我得到的是
crypto/bcrypt:hashedPassword不是给定密码的哈希值
错误。怎么了

func encryptPassword(password string) (string, error) {
    bytePass := []byte(password)
    hashedPassword, err := bcrypt.GenerateFromPassword(bytePass, bcrypt.DefaultCost)
    if err != nil {
        log.Printf("ERROR:EncryptPassword: %s", err.Error())
    }
    return string(hashedPassword), err
}

func (i *Impl) Register(user User) bool {
    hashedPass, err := encryptPassword(user.Password)
    if err != nil {
        return false
    }

    user.Password = hashedPass

    if err := i.DB.Create(&user).Error; err != nil {
        log.Printf("ERROR:Register: %s", err.Error())
        return false
    }
    return true
}

func (i *Impl) Login(email string, password string) (User, error) {
    var user User
    i.DB.Where("email = ?", email).First(&user)   

    err := bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
    if err != nil {
        log.Printf("ERROR:Login: %s", err.Error())
        return User{}, err
    }

    return user, err
}

我无法分辨哪个是哪个,但在比较函数中,请确保变量位于正确的位置

bcrypt.CompareHashAndPassword([]byte(user.Password), []byte(password))
           Must be the already hashed PW ^              ^ Plain Text Password to compare

还要确保你确实得到了一些东西,你可能会得到一个空密码,但没有意识到它,因为散列看起来仍然是满的。

我打赌是
用户。在你将密码传递给
encryptPassword
之前,你的
注册表中的密码
是空的,从而导致像你提供的那样对空密码进行散列(
$2a$10$rqhjthsxmbtx/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e
).

我的错误是,它比较了两个bcrypt hashedpassword,而不是一个hashedpassword和您的未加密密码转换成二进制-希望这对其他人有所帮助!

您能提供一个
用户内容的示例吗。password
您是否比较了数据库中的字节以确保它得到正确更新y、 没有任何修改吗?例如,这里是db
2a$10$RQHJthsXMBTX/5ZJG1MFUYYBUDW1PLBFWQRN0UCHWES38C/0m3e的散列密码,这是从
123456
生成的。然后我比较散列密码和普通密码,它是
123456
@Danilo@JimB
Register
获取指向
用户的指针,howev呃,当调用
i.DB.Create
时,您使用的是指向指针的指针。这是故意的吗?请注意阅读本文的每个人。我遇到了类似的问题。不要将DB中的哈希密码与密码的哈希进行比较。将其与普通密码进行比较。[]字节和[]字节的接口字节让我困惑。
user.Password
来自db,所以它已经是散列密码。@Melihmuck你确定它是正确的吗?你是否尝试在散列之前记录值?是的,你可以用
fmt.Println(bcrypt.CompareHashAndPassword([]字节)轻松验证这一点(“$2a$10$rqhjthsxmbtx/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e”),[]字节{}”)
只打印
nil
。您应该在
加密密码中添加一个检查,以确保不会发生这种情况。