2013-07-03 14 views
40

वसंत सुरक्षा 3.1.4.RELEASE के रूप में, पुराने org.springframework.security.authentication.encoding.PasswordEncoderhas been deprecatedorg.springframework.security.crypto.password.PasswordEncoder के पक्ष में नए पासवर्ड एन्कोडर का उपयोग कैसे करें। चूंकि मेरा आवेदन अभी तक जनता को जारी नहीं किया गया है, इसलिए मैंने नए स्थानांतरित करने का फैसला किया, न कि बहिष्कृत एपीआई।वसंत सुरक्षा

अब तक, मेरे पास ReflectionSaltSource था जो स्वचालित रूप से उपयोगकर्ता के पंजीकरण दिनांक को पासवर्ड के लिए उपयोगकर्ता के नमक के रूप में उपयोग करता था।

String encodedPassword = passwordEncoder.encodePassword(rawPassword, saltSource.getSalt(user)); 

प्रवेश प्रक्रिया के दौरान, वसंत भी मेरी सेम इस्तेमाल किया यह सत्यापित करें कि उपयोगकर्ता या साइन इन नहीं कर सकते हैं उचित मैं नया पासवर्ड एनकोडर में इस लक्ष्य को हासिल नहीं कर सकते, क्योंकि SHA-1 के डिफ़ॉल्ट कार्यान्वयन। - StandardPasswordEncoder में एन्कोडर निर्माण के दौरान वैश्विक गुप्त नमक जोड़ने की क्षमता है।

क्या गैर-बहिष्कृत एपीआई के साथ इसे सेट अप करने का कोई उचित तरीका है?

उत्तर

48

यदि आपने वास्तव में अपने मौजूदा प्रारूप वाले किसी भी उपयोगकर्ता को पंजीकृत नहीं किया है तो आप इसके बजाय BCrypt password encoder का उपयोग करने के लिए स्विच करना सबसे अच्छा होगा।

यह बहुत कम परेशानी है, क्योंकि आपको नमक के बारे में चिंता करने की ज़रूरत नहीं है - विवरण एन्कोडर के भीतर पूरी तरह से encapsulated हैं। बीक्रीप्ट का उपयोग एक सादा हैश एल्गोरिदम का उपयोग करने से मजबूत है और यह एक मानक भी है जो अन्य भाषाओं का उपयोग कर अनुप्रयोगों के अनुकूल है।

नए एप्लिकेशन के लिए किसी अन्य विकल्प को चुनने का कोई कारण नहीं है।

+3

तो यदि आपके पास वास्तव में पंजीकृत उपयोगकर्ता हैं तो क्या होगा? मुझे लगता है कि पासवर्डकोडर को किसी बिंदु पर हटा दिया जाएगा। माइग्रेट कैसे करें? – Marc

+7

माइग्रेटिंग खातों में आम तौर पर आवश्यकता होती है कि जब उपयोगकर्ता सफलतापूर्वक लॉग इन करता है तो आप पासवर्ड को फिर से बंद कर देते हैं। आपको माइग्रेशन अवधि के लिए एकाधिक एल्गोरिदम का भी समर्थन करना होगा। इसके अलावा आपको पासवर्ड रीसेट की आवश्यकता हो सकती है या अंततः अप्रयुक्त खातों को लॉक या हटाया जा सकता है, जिनका अतिरिक्त अवधि के लिए उपयोग नहीं किया गया था। यह आपके सिस्टम और आवश्यकताओं पर निर्भर करता है। मुझे यकीन है कि यदि आप कुछ खोज करते हैं तो आप इस पर चर्चा कर सकते हैं, क्योंकि यह एक आम समस्या है और पासवर्ड डीबी समझौता की संख्या बढ़ने के साथ अधिक प्रासंगिक हो रही है। कम से कम आप [plaintext] (http://ow.ly/qZQh0) का उपयोग नहीं कर रहे हैं :-)। –

+1

मेरे पास एक ऐसा एप्लिकेशन है जो लाइव है और पुराना पासवर्ड एन्कोडर का उपयोग नमक के साथ कर रहा है। क्या नए पासवर्ड एन्कोडर में माइग्रेट करने के बारे में कोई उदाहरण है? – user2213684

3

इस पर पढ़ने के लिए इंटरनेट के चारों तरफ जाने के बाद और वसंत में विकल्प दूसरे ल्यूक के जवाब का उपयोग करेंगे, बीसीआरपीटी का उपयोग करें (यह वसंत में source code में उल्लिखित है)।

सबसे अच्छा संसाधन जो मैंने पाया है कि हैश/नमक क्यों है और बीयरिप्ट का उपयोग क्यों करना एक अच्छा विकल्प है: Salted Password Hashing - Doing it Right

+0

bcrypt का उपयोग करते समय एक अच्छा विचार है, आपके द्वारा लिंक किए गए आलेख में कई भयानक विचार हैं, जैसे तेज़ हैशिंग का उपयोग करना। विवरण के लिए reddit टिप्पणियां देखें http://www.reddit.com/r/programming/comments/1yrnbo/salted_password_hashing_doing_it_right/cfnaqkl –

17

यहां बीसीक्रिप्ट का कार्यान्वयन है जो मेरे लिए काम कर रहा है।

वसंत-security.xml

<authentication-manager > 
    <authentication-provider ref="authProvider"></authentication-provider> 
    </authentication-manager> 
<beans:bean id="authProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> 
    <beans:property name="userDetailsService" ref="userDetailsServiceImpl" /> 
    <beans:property name="passwordEncoder" ref="encoder" /> 
</beans:bean> 
<!-- For hashing and salting user passwords --> 
    <beans:bean id="encoder" class="org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder"/> 

में

जावा वर्ग

PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(); 
String hashedPassword = passwordEncoder.encode(yourpassword); 

में वसंत सुरक्षा Click Here

आशा इस में मदद मिलेगी की अधिक विस्तृत उदाहरण के लिए।

धन्यवाद

+0

आपके उपयोगकर्ताDetailsServiceImpl में क्या शामिल है? – Richard

5

मुझे एक समान समस्या थी। मुझे विरासत एन्क्रिप्टेड पासवर्ड (बेस 64/SHA-1/यादृच्छिक नमक एनकोडेड) रखने की आवश्यकता है क्योंकि उपयोगकर्ता अपने पासवर्ड बदलना या पुनः पंजीकरण नहीं करना चाहते हैं। हालांकि मैं बीक्रिप्ट एन्कोडर का आगे बढ़ना चाहता था।

मेरे समाधान पहले से आरक्षित डिकोडर को देखने के लिए जो एन्क्रिप्शन विधि पहले मिलान से पहले इस्तेमाल किया गया था की जाँच करता है कि लिखने के लिए किया गया था (BCrypted लोगों $ के साथ शुरू)।

नमक समस्या के समाधान पाने के लिए, मुझे अपने संशोधित उपयोगकर्ता वस्तु के माध्यम से डिकोडर एक concatenated स्ट्रिंग नमक + एनक्रिप्टेड पासवर्ड की में गुजरती हैं।

डिकोडर

@Component 
public class LegacyEncoder implements PasswordEncoder { 

    private static final String BCRYP_TYPE = "$"; 
    private static final PasswordEncoder BCRYPT = new BCryptPasswordEncoder(); 

    @Override 
    public String encode(CharSequence rawPassword) { 

    return BCRYPT.encode(rawPassword); 
    } 

    @Override 
    public boolean matches(CharSequence rawPassword, String encodedPassword) { 

    if (encodedPassword.startsWith(BCRYP_TYPE)) { 
     return BCRYPT.matches(rawPassword, encodedPassword); 
    } 

    return sha1SaltMatch(rawPassword, encodedPassword); 
    } 

    @SneakyThrows 
    private boolean sha1SaltMatch(CharSequence rawPassword, String encodedPassword) { 

    String[] saltHash = encodedPassword.split(User.SPLIT_CHAR); 

    // Legacy code from old system 
    byte[] b64salt = Base64.getDecoder().decode(saltHash[0].getBytes()); 
    byte[] validHash = Base64.getDecoder().decode(saltHash[1]); 
    byte[] checkHash = Utility.getHash(5, rawPassword.toString(), b64salt); 

    return Arrays.equals(checkHash, validHash); 
    } 

} 

उपयोगकर्ता ऑब्जेक्ट

public class User implements UserDetails { 

    public static final String SPLIT_CHAR = ":"; 

    @Id 
    @Column(name = "user_id", nullable = false) 
    private Integer userId; 

    @Column(nullable = false, length = 60) 
    private String password; 

    @Column(nullable = true, length = 32) 
    private String salt; 



@PostLoad 
    private void init() { 

    username = emailAddress; //To comply with UserDetails 
    password = salt == null ? password : salt + SPLIT_CHAR + password; 
    }   

तुम भी नए BCrypt प्रारूप में एन्कोड फिर पासवर्ड और इसे बदलना एक हुक जोड़ सकते हैं। इस प्रकार पुरानी विधि को खत्म करना।

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