2016-02-22 17 views
6

Tôi mã hóa mật khẩu của người dùng và lưu vào db. Sau đó, để đăng nhập người dùng, so sánh mật khẩu băm và mật khẩu đơn giản, tôi nhận được lỗi crypto/bcrypt: hashedPassword is not the hash of the given password. Chuyện gì vậy ?crypto/bcrypt: hashedPassword không phải là mã băm của mật khẩu đã cho

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 
} 
+0

Bạn có thể cung cấp ví dụ về nội dung của 'user.Password' – Danilo

+0

Bạn đã so sánh các byte từ DB để đảm bảo nó được cập nhật đúng cách và không bị sửa đổi theo bất kỳ cách nào? Ví dụ: – JimB

+0

, đây là mật khẩu băm từ db '$ 2a $ 10 $ rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e', được tạo từ' 123456'. Sau đó, tôi so sánh mật khẩu băm và mật khẩu đơn giản là '123456' @Danilo @JimB –

Trả lời

0

Tôi không thể biết cái nào, nhưng trong hàm so sánh, hãy đảm bảo rằng bạn có các biến ở đúng vị trí.

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

Đồng thời đảm bảo bạn thực sự nhận được mật khẩu trống nhưng không nhận ra vì băm vẫn trông đầy.

+0

'user.Password' xuất phát từ db, vì vậy nó đã được băm mật khẩu. –

+0

@MelihMucuk bạn có chắc là nó đang bẻ khóa đúng không? Bạn đã cố gắng đăng nhập những gì giá trị trước khi nó được băm? – Datsik

3

Đặt cược của tôi là user.Password bị trống trong chức năng Register trước khi bạn chuyển nó đến encryptPassword do đó dẫn đến băm trên mật khẩu trống như mật khẩu bạn đã cung cấp ($2a$10$rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e).

+0

Có, bạn có thể xác minh điều này một cách dễ dàng với 'fmt.Println (bcrypt.CompareHashAndPassword ([] byte (" $ 2a $ 10 $ rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e "), [] byte {}))' chỉ in 'nil'. Bạn nên thêm một kiểm tra để 'encryptPassword' để đảm bảo điều này không xảy ra. – djd

Các vấn đề liên quan