2013-06-21 11 views
13

आज मैंने 3.1.3 से 3.1.4 तक काम कर रहे एप्लिकेशन के वसंत सुरक्षा संस्करण को अपग्रेड किया, और मैंने org.springframework.security.authentication.encoding.ShaPasswordEncoder कक्षा पर एक बहिष्करण चेतावनी देखी।स्प्रिंग सुरक्षा 3.1.4 और शापास्वर्ड एन्कोडर बहिष्करण

तो मैंने नए org.springframework.security.crypto.password.StandardPasswordEncoder कार्यान्वयन के लिए स्विच किया।

मैंने यह काम किया था और मैं एक नया उपयोगकर्ता पंजीकृत करने और अपने आवेदन में लॉगिन करने में सक्षम हूं, लेकिन, जैसा कि मुझे डर था, मैं पिछले ShaPasswordEncoder और मेरे कस्टम नमक से उत्पन्न पासवर्ड का उपयोग करके लॉगिन करने में सक्षम नहीं हूं।

चूंकि मेरे पास पहले से पंजीकृत कई उपयोगकर्ताओं के साथ एक डेटाबेस है, पुराने एन्कोडेड पासवर्ड को अमान्य किए बिना कार्यान्वयन स्विच करने के लिए मुझे क्या करना चाहिए? क्या यह भी संभव है?

यह भी देखें: How to use new PasswordEncoder from Spring Security

उत्तर

17

यदि आप अधिक सुरक्षित पासवर्ड एन्कोडिंग तंत्र पर स्विच करना चाहते हैं, तो मैं आपको BCrypt का उपयोग करने की सलाह दूंगा। मैं अपने उपयोगकर्ताओं को विस्थापित करने के लिए कुछ इस तरह का प्रयोग करेंगे:

// Implement the old PasswordEncoder interface 
public class MigrateUsersPasswordEncoder implements PasswordEncoder { 
    @Autowired 
    ShaPasswordEncoder legacyEncoder; 
    @Autowired 
    JdbcTemplate template; 

    BCryptPasswordEncoder bcryptEncoder = new BCryptPasswordEncoder(); 

    @Override 
    public String encodePassword(String rawPass, Object salt) { 
     return bcryptEncoder.encode(rawPass); 
    } 

    @Override 
    public boolean isPasswordValid(String encPass, String rawPass, Object salt) { 
     if (legacyEncoder.isPasswordValid(encPass, rawPass, salt)) { 
      template.update("update users set password = ? where password = ?", bcryptEncoder.encode(rawPass), encPass); 
      return true; 
     } 
     return bcryptEncoder.matches(rawPass, encPass); 
    } 
} 

आप देख सकते हैं उपयोगकर्ताओं का कितना अनुपात पासवर्ड क्षेत्र के प्रारूप के आधार पर स्थानांतरित हो गया। बीसीआरपीटी स्ट्रिंग्स में $ चिह्न से शुरू होने वाला एक विशिष्ट वाक्यविन्यास होता है।

अन्य उत्तरों में से एक यह इंगित करता है कि यह कोड एक ही समय में कई पासवर्ड गलती से अपडेट कर सकता है। सवाल में कहा गया है कि एक कस्टम नमक का उपयोग किया जा रहा था, इसलिए अगर नमक यादृच्छिक रूप से चुना जाता है तो टक्कर का मौका नगण्य होता है, लेकिन यह हमेशा मामला नहीं हो सकता है। यदि दो पासवर्ड अपडेट किए गए थे, तो समस्या क्या होगी? तब यह पता लगाना संभव होगा कि खातों में bcrypt हैश से एक ही पासवर्ड है। वैसे भी यह मामला है क्योंकि यह आवश्यक है कि एसएचए हैंश अपडेट होने के लिए समान थे। यदि आपको लगता है कि यह एक समस्या हो सकती है (उदाहरण के लिए खराब नमक पसंद या यहां तक ​​कि अनसाल्टेड हैश का उपयोग) यह एसक्यूएल को संशोधित करने के लिए छोटा होगा और अलग-अलग बीसीक्रिप्ट हश मानों के साथ कई अपडेट निष्पादित करेगा।

+0

कोड के लिए धन्यवाद। स्पिफ ने सुझाव दिया कि यह कम या ज्यादा है। इसके बजाय मेरा लक्ष्य एक ही समय में दो कार्यान्वयन किए बिना वसंत सुरक्षा की भावी रिलीज में अपग्रेड करने में सक्षम होना है, साथ ही यह समाधान केवल तभी काम करेगा जब प्रत्येक उपयोगकर्ता साइन इन करेगा। मुझे उम्मीद है कि इसे पुराने के साथ संगत कार्यान्वयन शुरू किया जाएगा। ShaPasswordEncoder। –

+0

यदि उपयोगकर्ता कभी साइन इन नहीं करते हैं तो यह तय करने योग्य होगा कि खाते बनाए रखने योग्य हैं (उपयुक्त समीक्षा अवधि के बाद)। यदि वे निष्क्रिय हैं तो आप उन्हें अस्थायी रूप से अक्षम कर सकते हैं और उपयोगकर्ताओं को उनके पासवर्ड को रीसेट करने के लिए कह सकते हैं। पुराने पासवर्ड एन्कोडर्स का उपयोग निराश होता है क्योंकि वे अपेक्षाकृत असुरक्षित, त्रुटि-प्रवण और अन्य प्रणालियों के साथ असंगत होते हैं। कक्षाओं को नए ऐप्स में उनके उपयोग को हतोत्साहित करने के लिए बहिष्कृत किया गया है, लेकिन यदि आप वास्तव में अधिक सुरक्षित विकल्प का उपयोग नहीं करना चाहते हैं तो आप उनका उपयोग रोकने के लिए कुछ भी नहीं है। –

1

एक उत्कृष्ट सवाल है और कुछ जवाब पढ़ने के लिए आगे देख रहा हूँ कि।

AFAIK एक बड़े पैमाने पर अद्यतन में करना असंभव है: आप केवल एक हैश से मूल स्ट्रिंग को पुनर्प्राप्त नहीं कर सकते हैं। यदि सबमिट किया गया पासवर्ड किसी भी रणनीति से मेल खाता है और इसे आवश्यकतानुसार नई रणनीति में परिवर्तित कर देता है, तो आपको लॉगिन प्रयास के दौरान जांच करनी होगी, लेकिन इसका मतलब है कि आपको दोनों एन्कोडिंग रणनीतियों के साथ रहना होगा जब तक कि सभी उपयोगकर्ता लॉग इन नहीं करते हैं और इसलिए सभी पासवर्ड परिवर्तित। बोर्ड पर आने वाले नए डेवलपर्स के लिए बहुत सुविधाजनक और न ही जरूरी नहीं है।

2

मैंने स्वीकृत उत्तर पर एक टिप्पणी जोड़ने की कोशिश की, लेकिन हां, मेरे पास अभी तक पर्याप्त क्रेडिट नहीं है। :(

मेरा मानना ​​है कि स्वीकृत उत्तर का कोड स्निपेट संभावित रूप से खतरनाक है जहां यह डेटाबेस में पासवर्ड अपडेट करता है। यदि शापासवर्ड एन्कोडर एन्क्रिप्टिंग करते समय समान परिणाम उत्पन्न करता है (यही कारण है कि धारणा बनाई जा रही है कि पुराना पासवर्ड पाया जा सकता है , और मैंने सत्यापित किया कि यह कम से कम शापसवर्ड एन्कोडर पर शून्य नमक के साथ सच है), आप अभी भी गारंटी नहीं दे सकते कि पासवर्ड सभी उपयोगकर्ताओं के बीच अद्वितीय है। आप मौके पर, सिस्टम पर किसी अन्य उपयोगकर्ता के समान पासवर्ड साझा कर सकते हैं, और कि SQL कोड आपके पासवर्ड रखने वाले सभी उपयोगकर्ताओं को बदल देगा।

मुझे लगता है कि सबसे सुरक्षित रणनीति उपयोगकर्ता के पासवर्ड को अपडेट नहीं करना है, और इसके बजाय एक प्रवासन रणनीति प्रदान करना जो शापास्वायर को अंतिम रूप से हटाने की योजना है dEncoder।

  • प्रदान किए गए उदाहरण कोड का उपयोग करें।
  • डेटाबेस को अद्यतन करने वाले कोड को हटाएं।
  • ShaPasswordEncoder को हटाए जाने पर उपयोगकर्ताओं के अंतिम मामले को संभालने के लिए "अपना पासवर्ड भूल गए" या "नया पासवर्ड उत्पन्न करें" जैसी सुविधा जोड़ें। या तो जब आप स्प्रिंग सिक्योरिटी में अपग्रेड करते हैं तो इसे हटा दिया जाता है, या इसे स्वयं निकालने का विकल्प चुनें।
  • अपने दस्तावेज़ों को अपडेट करें या इसे स्पष्ट करें कि सॉफ़्टवेयर के अगले प्रमुख रिलीज़ संस्करण में, उपयोगकर्ताओं को अपने पासवर्ड को फिर से सहेजना होगा या पहले उल्लिखित पासवर्ड रीसेट सुविधा का उपयोग करना होगा।
  • उपयोगकर्ता को संक्रमण के लिए एक प्रमुख संस्करण रिलीज चक्र की ग्रेस अवधि दें (वे शायद इसे नहीं करेंगे और केवल रीसेट पासवर्ड में पकड़े जाएंगे)।
+0

यह एक अच्छा मुद्दा है। हालांकि, मुझे नहीं लगता कि यह मौजूदा स्थिति की तुलना में वास्तव में खतरनाक है या अपडेट को स्थगित कर दिया जाना चाहिए। यह कामकाज के लिए भी तुच्छ है। मैंने कुछ अतिरिक्त विचार जोड़ने के लिए अपना जवाब अपडेट किया। –

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