2016-02-22 24 views
6

Kullanıcı şifresini şifreleyip db'ye kaydedin. Sonra kullanıcı girişi, hashed şifre ve düz şifre karşılaştırın, ben crypto/bcrypt: hashedPassword is not the hash of the given password hatası alıyorum. Sorun nedir ?crypto/bcrypt: hashedPassword verilen şifrenin karma değil

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

Kullanıcı user.Password' içeriğine bir örnek verebilir misiniz? – Danilo

+0

Doğru şekilde güncellendiğinden ve herhangi bir şekilde değiştirilmediğinden emin olmak için baytları DB'den karşılaştırdınız mı? – JimB

+0

Örneğin, burada '123456' dan üretilen db '$ 2a $ 10 $ rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e', hashed şifresidir. Sonra hashed parola ve düz parola ile karşılaştırıyorum. 123456' @Danilo @JimB –

cevap

0

Hangisinin hangisi olduğunu söyleyemiyorum, ancak karşılaştırma işlevinizde değişkenleri doğru yerde olduğundan emin olun.

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

Ayrıca aslında, sen karma hala dolu bakacağız çünkü farkında boş şifre alma ama olabilir karma bir şeyler alıyoruz sağlamak.

+0

'user.Password' db'den geliyor, bu yüzden zaten şifreli bir şifre var. –

+0

@MelihMucuk doğru şeyi esirgittiğinden emin misin? Değerin eskisinden önce ne olduğunu günlüğe kaydetmeye çalıştın mı? – Datsik

3

Bahse girerim böylece sağlanan birinin ($2a$10$rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e) gibi boş şifrelerle ilgili sağlamalarının giden encryptPassword için geçirmeden önce user.Password sizin Register işlevi boş olmasıdır.

+0

Evet, bunu kolayca 'fmt.Println (bcrypt.CompareHashAndPassword ([] byte ("$ 2a $ 10 $ rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e"), [] byte {})) ile kolayca doğrulayabilirsiniz. Bunun gerçekleşmediğinden emin olmak için 'encryptPassword''a bir kontrol eklemelisiniz. – djd