2012-09-19 23 views
8

से शिरो के नमक का स्टॉक और उपयोग कैसे करें मैं प्रमाणीकरण के लिए आवेदन में शिरो का उपयोग करता हूं। मैं एक नमक के साथ टुकड़ों में बंटी पासवर्ड का उपयोग करें और मैं इस तरह मेरे डेटाबेस में संग्रहीत:डाटाबेस

private User createUserWithHashedPassword(String inName, String inFirstName, String inLastName, String inPassword){ 

    ByteSource salt = randomNumberGenerator.nextBytes(32); 

    byte[] byteTabSalt = salt.getBytes(); 

    String strSalt = byteArrayToHexString(byteTabSalt); 

    String hashedPasswordBase64 = new Sha256Hash(inPassword, salt, 1024).toBase64(); 

    return new User(inName,inFirstName,inLastName,hashedPasswordBase64,strSalt); 
} 

मैं अपने डेटाबेस में एक स्ट्रिंग के साथ नमक की दुकान। अब मेरे दायरे में मैं डेटाबेस से अपने डेटा वापस लेना चाहता हूं, मैं इसके लिए एक लेनदेन सेवा का उपयोग करता हूं। लेकिन मेरे नमक एक मजबूत है तो मैं इसे वापस ByteSource प्रकार के रूप में स्थिर विधि के साथ चालू करना चाहते हैं:

ByteSource byteSourceSalt = Util.bytes(salt); //where the salt is a String 

लेकिन जब मैंने बनाने SaltedAuthenticationInfo यह प्रमाणन नहीं है।

मुझे लगता है कि मेरी समस्या मेरी परिवर्तित विधि से है:

private String byteArrayToHexString(byte[] bArray){ 

     StringBuffer buffer = new StringBuffer(); 

     for(byte b : bArray) { 
      buffer.append(Integer.toHexString(b)); 
      buffer.append(" "); 
     } 

return buffer.toString().toUpperCase();  
} 

आपकी मदद के लिए धन्यवाद।

उत्तर

13

उत्कृष्ट जवाब https://stackoverflow.com/a/20206115/603901 में उल्लेख किया है, Shiro के DefaultPasswordService पहले से ही प्रत्येक पासवर्ड के लिए अद्वितीय लवण उत्पन्न बनाया गया था।

हालांकि, प्रति उपयोगकर्ता नमक को एक निजी नमक (कभी-कभी "काली मिर्च" कहा जाता है) जोड़ने के लिए कस्टम पासवर्ड सेवा को लागू करने की आवश्यकता नहीं होती है। निजी नमक shiro.ini में विन्यस्त किया जा सकता:

[main] 
hashService = org.apache.shiro.crypto.hash.DefaultHashService 
hashService.hashIterations = 500000 
hashService.hashAlgorithmName = SHA-256 
hashService.generatePublicSalt = true 
# privateSalt needs to be base64-encoded in shiro.ini but not in the Java code 
hashService.privateSalt = myVERYSECRETBase64EncodedSalt 
passwordMatcher = org.apache.shiro.authc.credential.PasswordMatcher 

passwordService = org.apache.shiro.authc.credential.DefaultPasswordService 
passwordService.hashService = $hashService 
passwordMatcher.passwordService = $passwordService 
उससे मिलते-जुलते पासवर्ड हैश पैदा करने के लिए

जावा कोड:

$shiro1$SHA-256$500000$An4HRyqMJlZ58utACtyGDQ==$nKbIY9Nd9vC89G4SjdnDfka49mZiesjWgDsO/4Ly4Qs= 

निजी नमक:

DefaultHashService hashService = new DefaultHashService(); 
hashService.setHashIterations(HASH_ITERATIONS); // 500000 
hashService.setHashAlgorithmName(Sha256Hash.ALGORITHM_NAME); 
hashService.setPrivateSalt(new SimpleByteSource(PRIVATE_SALT)); // Same salt as in shiro.ini, but NOT base64-encoded. 
hashService.setGeneratePublicSalt(true); 

DefaultPasswordService passwordService = new DefaultPasswordService(); 
passwordService.setHashService(hashService); 
String encryptedPassword = passwordService.encryptPassword("PasswordForThisUser"); 

जिसके परिणामस्वरूप हैश इस तरह दिखता है डेटाबेस में संग्रहीत नहीं है, जो किसी विरोधी को डेटाबेस डंप तक पहुंच प्राप्त करने पर पासवर्ड को क्रैक करना कठिन बनाता है।

इस उदाहरण का उपयोग कर बनाया गया था Shiro-1.2.2 shiro.ini

+1

डीबी में पृथक कॉलम में स्टोर करने के लिए शिरो द्वारा उत्पन्न सार्वजनिक नमक ऑटो कैसे प्राप्त किया जा सकता है – thoitbk

4

क्या आपने पासवर्डमैचर/पासवर्ड सेवा देखा है?

इसमें पहले से ही सभी एन्कोडिंग/डिकोडिंग/अंतर्निहित तर्क की तुलना है।

भंडारण पासवर्ड डेटाबेस में: इसका इस्तेमाल करने के लिए

PasswordService service = new DefaultPasswordService(); // or use injection or shiro.ini to populate this 

private User createUserWithHashedPassword(String inName, String inFirstName, String inLastName, String inPassword){ 

    String hashedPasswordBase64 = service.encryptPassword(inPassword); 

    return new User(inName,inFirstName,inLastName,hashedPasswordBase64,strSalt); 
} 

तो आप बस अपने दायरे में मेल खाने के रूप में PasswordMatcher उपयोग कर सकते हैं।

realm.setCredentialsMatcher(new PasswordMatcher()); 

या shiro.ini में:

matcher = org.apache.shiro.authc.credential.PasswordMatcher 
realm.credentialsMatcher = $matcher 
+4

ठीक है, आपके उत्तर के लिए धन्यवाद के लिए वाक्य रचना के साथ मदद के लिए https://github.com/Multifarious/shiro-jdbi-realm/blob/master/src/test/resources/shiro.ini को

धन्यवाद। मैं कोशिश करूँगा लेकिन मुझे समझ में नहीं आता कि मुझे अब अपने नमक का उपयोग करना है और पासवर्ड और नमक के बीच का लिंक कहां है। – Fred37b

1

मैं अपने नमक की बचाने के लिए अपने प्रकार बदलें। अब मैं स्ट्रिंग के बजाए बाइट [] का उपयोग कर रहा हूं।

ByteSource salt = randomNumberGenerator.nextBytes(32); 

byte[] byteTabSalt = salt.getBytes(); 

और मैं अपने डेटाबेस में बाइटटैबल्ट को स्टॉक करता हूं।

4

डिफ़ॉल्ट पासवर्डवर्ड सेवा कार्यान्वयन स्वचालित रूप से प्रत्येक एन्क्रिप्ट पासवर्ड कॉलम में यादृच्छिक नमक जोड़ता है। वह "सार्वजनिक" नमक "हैशपैसवर्डबेस 64" के भीतर संग्रहीत किया जाएगा जिसे आप "एन्क्रिप्टपास्वर्ड" से प्राप्त करते हैं।

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

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

यह एक बहुत ही बुनियादी उदाहरण है कि कैसे एक PasswordService कि एक निरंतर स्ट्रिंग के रूप में एक "निजी" नमक का इस्तेमाल करता है बनाने के लिए है और कहा कि CredentialsMatcher के रूप में काम करता है:

public class MyPrivateSaltingPasswortService extends DefaultPasswordService 
{ 
    public MyPrivateSaltingPasswortService() 
    { 
     super(); 
     HashService service = getHashService(); 
     if (service instanceof DefaultHashService) 
     { 
     ((DefaultHashService) service).setPrivateSalt(
      new SimpleByteSource("MySuperSecretPrivateSalt")); 
     } 
    } 
} 

आप तो Shiro में अपने स्वयं के कार्यान्वयन इस्तेमाल कर सकते हैं।आरं:

[main] 
saltedService = com.mycompany.MyPrivateSaltingPasswortService 
matcher = org.apache.shiro.authc.credential.PasswordMatcher 
matcher.passwordService = $saltedService 
realm.credentialsMatcher = $matcher 

इस उदाहरण का उपयोग करते हुए Shiro-1.2.2

+0

क्या आप समझा सकते हैं: "DefaultPasswordService कार्यान्वयन स्वचालित रूप से प्रत्येक एन्क्रिप्ट पासवर्ड कॉलम में एक यादृच्छिक नमक जोड़ता है।" सार्वजनिक "नमक" एन्क्रिप्टेड पासवर्ड "से प्राप्त" हैशपैसवर्डबेस 64 "में संग्रहीत किया जाएगा।" मुझे समझ में नहीं आ रहा है कि इस सार्वजनिक नमक को अलग कॉलम में सहेजा जाना चाहिए (पासवर्ड कॉलम नहीं)? –

+0

अब तक आपको डेटाबेस में अतिरिक्त नमक लगाने की आवश्यकता नहीं है। - तुम्हारा क्या मतलब था? –

+1

हैलो पाशा, जेनरेट किए गए टोकन में कई अलग-अलग सूचना ब्लॉक हैं। इन ब्लॉकों में से एक सार्वजनिक नमक है इसलिए शिरो फिर से हैश कर सकता है और फिर से उपयोगकर्ता द्वारा दर्ज पासवर्ड का परीक्षण कर सकता है। जब तक आप जेनरेट किए गए टोकन को "जैसा है" स्टोर करते हैं, आपको सार्वजनिक नमक को स्टोर करने की आवश्यकता नहीं होती है - आपको इसे भी नहीं पता है क्योंकि शिरो इसका ख्याल रखता है। कृपया माइकल फाल्कविड्ड के उत्तर पर एक नज़र डालें - जेनरेट किए गए टोकन का एक उदाहरण है और एक निजी नमक को परिभाषित करने का विकल्प भी है। – seafoxx

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

  • कोई संबंधित समस्या नहीं^_^