2011-06-08 9 views
5

मैं Play 1.2.1 का उपयोग कर रहा हूं। मैं अपने उपयोगकर्ता पासवर्ड हैश करना चाहता हूँ। मैंने सोचा कि Crypto.passwordHash अच्छा होगा, लेकिन ऐसा नहीं है। पासवर्ड हैश दस्तावेज कहता है कि यह एमडी 5 पासवर्ड हैश देता है। मैं स्थिरता में कुछ उपयोगकर्ता खातों, जहां मैं md5 पासवर्ड हैश डाल बनाया:प्ले करें! हैश पासवर्ड खराब परिणाम देता है

... 
User(admin): 
    login: admin 
    password: f1682b54de57d202ba947a0af26399fd 
    fullName: Administrator 
    ... 

समस्या यह है, जब मैं कुछ इस तरह के साथ, में लॉग इन करने का प्रयास करें:

user.password.equals(Crypto.passwordHash(password)) 

और यदि ऐसा नहीं होता काम। तो मैं अपने autentify विधि में एक लॉग बयान डाल:

Logger.info("\nUser hashed password is %s " + 
        "\nPassed password is %s " + 
        "\nHashed passed password is %s", 
        user.password, password, Crypto.passwordHash(password)); 

और पासवर्ड हैश वास्तव में अलग हैं, लेकिन हे!

15:02:16,164 INFO ~ 
User hashed password is f1682b54de57d202ba947a0af26399fd 
Passed password is <you don't have to know this :P> 
Hashed passed password is 8WgrVN5X0gK6lHoK8mOZ/Q== 

कैसे उस के बारे में: passwordHash विधि के उत्पादन में भी एक MD5 हैश नहीं है? इसे कैसे जोड़ेंगे? या शायद मुझे अपना खुद का समाधान लागू करना है?

+0

बीटीडब्ल्यू पासवर्ड के लिए सरल MD5-Hash का उपयोग करने के लिए यह बहुत चालाक नहीं है। इसके अलावा कम से कम एक नमक होना चाहिए। – niels

+0

@niels - मुझे पता है, लेकिन यह सीखने के लिए सिर्फ एक साधारण नमूना परियोजना है! – jjczopek

+0

मुझे लगता है कि आपको नीचे दिए गए लिंक में जवाब पसंद हो सकता है, यह सुझाव देता है कि जावा http: // stackoverflow में md5 का उपयोग कैसे करें।कॉम/प्रश्न/415 9 53/जेनरेट-एमडी 5-हैश-इन-जावा – engin

उत्तर

5

Crypto.passwordHash बेस 64-एन्कोडेड पासवर्ड हैश देता है, जबकि आप हेक्स-एन्कोडेड की तुलना कर रहे हैं।

+2

व्यक्तिगत रूप से मुझे लगता है कि दस्तावेज़ों को इस विवरण का जिक्र करना चाहिए। – jjczopek

2

निकोलय ने कहा कि आप हेक्स बनाम बेस -64 तारों की तुलना कर रहे हैं। इसके अलावा, मैं इसके लिए BCrypt का उपयोग करने की सलाह दूंगा, न कि क्रिप्टो टूल ऑफ़ प्ले।

3

एमडी 5 16 बाइट्स का अनुक्रम आउटपुट करता है, प्रत्येक बाइट (संभावित रूप से) 0 और 255 (समावेशी) के बीच कोई मूल्य होता है। जब आप प्रिंट मान चाहते हैं, तो आपको बाइट्स को "प्रिंट करने योग्य वर्ण" के अनुक्रम में परिवर्तित करने की आवश्यकता है। कई संभावित सम्मेलन हैं, दो मुख्य हेक्साडेसिमल और बेस 64 हैं।

हेक्साडेसिमल नोटेशन में, प्रत्येक बाइट मान को दो "हेक्साडेसिमल अंक" के रूप में दर्शाया जाता है: ऐसा अंक या तो दशमलव अंक ('0' से '9') या एक अक्षर ('ए' से 'एफ' तक होता है, मामला अप्रासंगिक है)। इस प्रकार 16 बाइट 32 वर्ण बन जाते हैं।

बेस 64 एन्कोडिंग में, तीन लगातार बाइट्स के प्रत्येक समूह को 64 वर्णों (अंकों, लोअरकेस अक्षरों, अपरकेस अक्षरों, '+' और '/') की सूची में लिया गया चार वर्णों के रूप में एन्कोड किया गया है। एक या दो फाइनल '=' संकेत जोड़े जा सकते हैं ताकि एन्कोडेड स्ट्रिंग में कई वर्ण होते हैं जो 4 से अधिक होते हैं।

यहां, '8WgrVN5X0gK6lHoK8mOZ/Q ==' 16 के अनुक्रम का बेस 64 एन्कोडिंग है बाइट्स, पहला वाला मूल्य 241 है, दूसरा 104, फिर 43, और इसी तरह। हेक्साडेसिमल नोटेशन में, पहला बाइट 'एफ 1', दूसरा '68' द्वारा दूसरा, '2 बी' द्वारा तीसरा और 16 बाइट्स के पूर्ण अनुक्रम का हेक्साडेसिमल नोटेशन 'f1682b54de57d202ba947a0af26399fd' है, मान का प्रतिनिधित्व किया जाएगा कि आप की उम्मीद है।

play.libs.Codec कक्षा में बेस 64 और हेक्साडेसिमल नोटेशन को डीकोडिंग और एन्कोडिंग के तरीके शामिल हैं। इसमें Codec.hexMD5() भी शामिल है जो एमडी 5 हैशिंग करता है और बेस 64 के बजाय हेक्साडेसिमल नोटेशन में मान देता है।

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