2016-02-22 14 views
6

私はユーザーのパスワードを暗号化してdbに保存します。その後、ユーザーのログインに、ハッシュされたパスワードとプレーンパスワードを比較し、私はcrypto/bcrypt: hashedPassword is not the hash of the given passwordエラーを取得しています。どうしましたか ?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 
} 
+0

あなたは 'user.Password'の内容の例を提供できますか – Danilo

+0

DBからのバイトを比較して、正しく更新されていて、何も変更されていないことを確認しましたか? – JimB

+0

たとえば、 '$ 2a $ 10 $ rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e'というデータベースからのハッシュされたパスワードは、' 123456'から生成されます。次に、ハッシュされたパスワードとプレーンなパスワードを比較します。これは '123456'です@ダニロ@JimB –

答えて

0

どちらが、どのようなものかはわかりませんが、比較機能では、正しい場所に変数があることを確認できません。

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

また、あなたが実際にあなたが空白のパスワードを取得しますが、ハッシュはまだいっぱいになりますので、それを実現することではないことができ、ハッシュに何かを取得していることを確認します。

+0

'user.Password'はdbから来ているので、既にパスワードをハッシュしています。 –

+0

@MelihMucukあなたは正しいことを叩いていると確信していますか?値がハッシュされる前にログに記録しようとしましたか? – Datsik

3

私の賭けは、あなたは、このようにあなたが提供する1($2a$10$rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e)のような空のパスワードにハッシュにつながるencryptPasswordにそれを渡す前に、user.PasswordがあなたのRegister機能が空であることです。

+0

はい、単に 'nil'を出力する' fmt.Println(bcrypt.CompareHashAndPassword([] byte( "$ 2a $ 10 $ rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e")、[] byte {})) 'で簡単に確認できます。これが起こらないようにするには、 'encryptPassword'にチェックを入れるべきです。 – djd

関連する問題