2016-02-22 5 views
6

मैं उपयोगकर्ता का पासवर्ड एन्क्रिप्ट करता हूं और डीबी में सहेजता हूं। फिर उपयोगकर्ता लॉगिन करने के लिए, हैश पासवर्ड और सादा पासवर्ड की तुलना करें, मुझे crypto/bcrypt: hashedPassword is not the hash of the given password त्रुटि मिल रही है। क्या गलत है ?क्रिप्टो/bcrypt: हैशपैसवर्ड दिए गए पासवर्ड का हैश

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

की सामग्री का उदाहरण प्रदान कर सकते हैं क्या आपने डीबी से बाइट्स की तुलना की है ताकि यह सुनिश्चित किया जा सके कि यह ठीक से अपडेट हो रहा है, और किसी भी तरह से संशोधित नहीं किया गया है? उदाहरण के लिए – JimB

+0

, यहां डीबी '$ 2 ए $ 10 $ rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e' से पासवर्ड धोया गया है, यह' 123456' से उत्पन्न हुआ है। फिर मैं हैश पासवर्ड और सादा पासवर्ड की तुलना करता हूं जो '123456' @Danilo @JimB –

उत्तर

0

मैं यह नहीं बता सकता कि कौन सा है, लेकिन आपकी तुलनात्मक कार्य में, सुनिश्चित करें कि आपके पास सही जगह पर चर हैं।

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

यह भी सुनिश्चित आप वास्तव में हैश करने के लिए, आप इसे साकार क्योंकि हैश अभी भी पूर्ण दिखेगा एक रिक्त पासवर्ड हो रही हो सकता है लेकिन नहीं कुछ हो रही है।

+0

'उपयोगकर्ता। पासवर्ड 'डीबी से आता है, इसलिए यह पहले ही पासवर्ड धो चुका है। –

+0

@MelihMucuk क्या आप वाकई सही चीज को झुका रहे हैं? क्या आपने लॉग इन करने का प्रयास किया था कि इसे धोने से पहले क्या मूल्य है? – Datsik

3

मेरे शर्त है कि user.Password अपने Register समारोह में रिक्त है इससे पहले कि आप encryptPassword के पास इस प्रकार एक आपके द्वारा दी गई ($2a$10$rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e) की तरह खाली पासवर्ड पर हैश के लिए अग्रणी है।

+0

हां, आप इसे आसानी से 'fmt.Println (bcrypt.CompareHashAndPassword ([] बाइट ("$ 2a $ 10 $ rqHJJTHsxMbtX/5ZjG1mFuWyYbUDW1PLbfwQRN0uChwes38c/0m3e"), [] बाइट {}) के साथ आसानी से सत्यापित कर सकते हैं)' जो सिर्फ 'nil' प्रिंट करता है)। यह सुनिश्चित करने के लिए कि यह नहीं होता है, आपको 'एन्क्रिप्टपास्वर्ड' में एक चेक जोड़ना चाहिए। – djd

संबंधित मुद्दे