2009-11-30 13 views
15

मेरे पास इसके लॉगिन के लिए वसंत ढांचे और वसंत सुरक्षा का उपयोग कर एक जावा वेब एप्लिकेशन है। मेरे डेटाबेस में मेरे पास सहेजे जाने से पहले मेरे पासवर्ड MD5 को एन्क्रिप्ट किए गए हैं। मैं इस कोड अपने आवेदन-config.xml में जोड़ास्प्रिंग सिक्योरिटी एन्क्रिप्ट एमडी 5

<security:authentication-provider> 
<security:password-encoder hash="md5"/> 
<security:jdbc-user-service 
     data-source-ref="dataSource" 
     users-by-username-query="select user_name username, user_password password, 1 enabled from users where user_name=?" 
     authorities-by-username-query="select username, authority from authorities where username=?" /> 
</security:authentication-provider> 

पहले यह काम किया जब DB में पासवर्ड एन्क्रिप्टेड नहीं कर रहे थे पर। लेकिन जब मैंने उसे एन्क्रिप्टेड और अपने आवेदन config

 <security:password-encoder hash="md5"/> 

में इस स्निपेट जोड़ा मैं प्रवेश करने में सक्षम नहीं हूँ।

+7

md5 एक हैश फ़ंक्शन है, एन्क्रिप्शन की विधि नहीं है। – u0b34a0f6ae

+1

आपका क्या मतलब है। मैंने – cedric

उत्तर

6

आप अपना MD5 हैश कैसे बना रहे हैं? निम्नलिखित काम करता है अच्छी तरह से जावा में की तरह कुछ:

MessageDigest messageDigest = MessageDigest.getInstance("MD5"); 
messageDigest.update(user.getPassword().getBytes(),0, user.getPassword().length()); 
String hashedPass = new BigInteger(1,messageDigest.digest()).toString(16); 
if (hashedPass.length() < 32) { 
    hashedPass = "0" + hashedPass; 
} 

जब आप "कोअला" आप "a564de63c2d0da68cf47586ee05984d7" मिलता है सांकेतिक शब्दों में बदलना?

+0

आह ठीक किया होगा .. मुझे संदेश में 16 चूक गया Digest.digest())। ToString (16)। धन्यवाद – cedric

+0

वास्तव में, 31 से कम प्रतीकों से कम हो सकता है। इसलिए। यह कुछ परिस्थितियों में काम नहीं करेगा (बहुत दुर्लभ)। आपको तब तक "0" जोड़ना होगा जब तक आपके पास 32 प्रतीकों –

4

क्या आपने स्प्रिंग सुरक्षा संदर्भ मैनुअल से 6.3.3 Hashing and Authentication अनुभाग पढ़ा है? इसमें कुछ संभावित मुद्दों का उल्लेख किया गया है जिन्हें आप पासवर्ड हैशिंग का उपयोग करने में सामना कर सकते हैं।

कुछ संभावनाओं यह सूचीबद्ध:

  • डाटाबेस पासवर्ड हैश Base64 में हो सकता है, जबकि MD5PasswordEncoder से परिणाम हेक्साडेसिमल तार में है
  • आपका पासवर्ड हैश अपर-केस में हो सकता है, जबकि से परिणाम एन्कोडर कम केस स्ट्रिंग्स
47

मुझे एहसास है कि यह थोड़ा देर हो चुकी है, लेकिन वसंत में कक्षाएं अंतर्निहित हैं जो इसे बहुत आसान बनाती हैं।

@Test 
public void testSpringEncoder() { 
    PasswordEncoder encoder = new Md5PasswordEncoder(); 
    String hashedPass = encoder.encodePassword("koala", null); 

    assertEquals("a564de63c2d0da68cf47586ee05984d7", hashedPass); 
} 

यह एक इकाई परीक्षण है कि मैं वसंत सुरक्षा कोड में बनाया का उपयोग कर लिखा है, यह MessageDigest कोड की तुलना में बहुत छोटा होता है और जब से तुम स्प्रिंग सुरक्षा पहले से ही उपयोग कर रहे हैं, आप पहले से ही अपने classpath में कक्षाएं होनी चाहिए ।

+2

नहीं हैं यह सबसे अच्छा जवाब है। वसंत के साथ साफ और आसान। –

+1

यहां [एक और उत्तर] है (http://stackoverflow.com/questions/7378107/hashing-and-salting-passwords-with-spring-security-3) अपने स्प्रिंग एप्लिकेशन में इसे अच्छी तरह से उपयोग करने के तरीके के बारे में थोड़ा और विवरण के साथ । – chrisjleu

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