gpt4 book ai didi

postgresql - hashedSecret 太短,不能成为 bcrypted 密码而不是 auth

转载 作者:IT王子 更新时间:2023-10-29 01:39:52 26 4
gpt4 key购买 nike

我正在调整来自 this blogpost 的登录功能. User 结构(见下文)有四个字段,id、name、email 和 password。您可以在下面的数据库中看到一行。 login函数中的fmt.Println显示用户查询数据库后是这样的

 &{3 testuser $2a$10$hS7sth8jIBN2/IXFTWBibu3Ko5BXm9zHO5AJZRAbAOQ04uv.Gs5Ym [116 101 115 116 117 115 101 114 64 103 109 97 105 108 46 99 111 109]}

换句话说,它有 id (3)、name (testuser)、散列密码,还有一个让我吃惊的数字数组位,因为它不在数据库的行中(见下文)。您还会注意到 fmt.Println 没有显示电子邮件,即使它在数据库的行中可见,所以这里似乎有问题。

当 bcrypt 在 Login 函数中比较散列和密码时,它给我这个错误

hashedSecret too short to be a bcrypted password not auth

你能解释一下为什么会抛出这个错误吗?

func Login(password, email string) (u *User, err error) {
u = &User{}
err = db.QueryRow("select * from users where email=$1 ", email).Scan(&u.Id, &u.Name, &u.Password, &u.Email)
fmt.Println("u", u)

if err != nil {
fmt.Println("err", err)
}

err = bcrypt.CompareHashAndPassword(u.Password, []byte(password))
if err != nil {
u = nil
}
return
}

我有一个包含以下字段的用户结构

type User struct {
Id int
Name string
Email string
Password []byte
}

我像这样在 postgres 中为它创建了一个表

CREATE TABLE "public"."users" (
"id" int4 NOT NULL DEFAULT nextval('users_id_seq'::regclass),
"username" varchar(255) NOT NULL COLLATE "default",
"email" varchar(255) NOT NULL COLLATE "default",
"password" bytea
)
WITH (OIDS=FALSE);

这是数据库中的一行

id |  username  |        email         |                                                          password                                                          
----+------------+----------------------+----------------------------------------------------------------------------------------------------------------------------
3 | testuser | testuser@gmail.com | \x24326124313024685337737468386a49424e322f495846545742696275334b6f3542586d397a484f35414a5a524162414f51303475762e477335596d

最佳答案

数字数组是电子邮件地址。

package main

import (
"fmt"
)

func main() {
email := []byte{116, 101, 115, 116, 117, 115, 101, 114, 64, 103, 109, 97, 105, 108, 46, 99, 111, 109}
fmt.Println(email)
fmt.Println(string(email))
}

输出:

[116 101 115 116 117 115 101 114 64 103 109 97 105 108 46 99 111 109]
testuser@gmail.com

进一步研究后,我看到您有select *。不要那样做!您得到数据库返回的项目,不一定是您想要的。始终在您要返回的字段及其顺序中明确说明。

select * 中,使用 CREATE TABLE 定义,您可能得到 idusername电子邮件密码。从您的 Scan 中,您将 User 类型 Id 设置为 id,将 Name 设置为 usernamePasswordemailEmailpassword。换句话说,u.Password 包含 email(它们具有相同的 Go 数据类型)并且 email 太短而无法伪装成散列密码.

匹配selectScan中的字段,例如

"select id, username, password, email from users where email=$1 "

Scan(&u.Id, &u.Name, &u.Password, &u.Email)

关于postgresql - hashedSecret 太短,不能成为 bcrypted 密码而不是 auth,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25344109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com