दिलचस्प पोस्ट
कोड से वर्तमान विधि का नाम कैसे प्राप्त करें मैं छवियों के लिए ज़ूम कार्यक्षमता कैसे प्राप्त करूं? जावास्क्रिप्ट Regex: कैसे एक नियमित अभिव्यक्ति के अंदर एक चर डाल करने के लिए? स्मार्ट पॉइंटर क्या है और मुझे कब उपयोग करना चाहिए? PHP में स्ट्रिंग से भाषा का पता लगाएं जावा में रेगेक्स नाम समूह लॉगिन के लिए प्रमाणीकरण फ़िल्टर और सर्वलेट .htaccess – कैसे एक सामान्य तरीके से "www।" को मजबूर करने के लिए? एकाधिक वर्णों पर उपयोग किए जाने पर एकल उद्धरण सी ++ में करते हैं? एंड्रॉइड कैमरा से सर्वर पर वीडियो स्ट्रीमिंग पूर्णांक प्रभाग: आप डबल कैसे बनाते हैं? PHP के साथ आईपी पता देश प्राप्त करें पाठ में बिना अल्पविराम और बिना दशमलव अंकों के मिलान करने के लिए नियमित अभिव्यक्ति जावा में मूल्यांकन आदेश के लिए नियम क्या हैं? जावा 1.6: सूची की एक सरणी बनाना <T>

विन्यास फाइल में एन्क्रिप्ट पासवर्ड?

मेरे पास प्रोग्राम है जो एक कॉन्फ़िगरेशन फ़ाइल से सर्वर की जानकारी पढ़ता है और उस कॉन्फ़िगरेशन में पासवर्ड को एन्क्रिप्ट करना चाहता है, जिसे मेरे प्रोग्राम द्वारा पढ़ा जा सकता है और डिक्रिप्ट किया जा सकता है

requirments:

  • फ़ाइल में संग्रहीत करने के लिए सादा टेक्स्ट पासवर्ड को एन्क्रिप्ट करें
  • एन्क्रिप्ट किए गए पासवर्ड को मेरे प्रोग्राम से फ़ाइल से पढ़ते समय डिक्रिप्ट करें

मैं यह करने के बारे में कैसे जाना होगा पर कोई reccomendations? मैं अपने स्वयं के एल्गोरिथ्म लिखने की सोच रहा था लेकिन मुझे लगता है कि यह बहुत असुरक्षित होगा।

वेब के समाधान से एकत्रित समाधान "विन्यास फाइल में एन्क्रिप्ट पासवर्ड?"

ऐसा करने का एक आसान तरीका जावा में पासवर्ड आधारित एन्क्रिप्शन का उपयोग करना है। यह आपको एक पासवर्ड का उपयोग करके पाठ को एन्क्रिप्ट और डिक्रिप्ट करने की अनुमति देता है।

इसका मूल रूप से एक javax.crypto.Cipher को एल्गोरिथम "AES/CBC/PKCS5Padding" साथ आरंभ करने का अर्थ है और "PBKDF2WithHmacSHA512" एल्गोरिथ्म के साथ "PBKDF2WithHmacSHA512" से कुंजी प्राप्त करना।

यहां एक कोड का उदाहरण है (कम सुरक्षित MD5- आधारित संस्करण को बदलने के लिए अपडेट किया गया है):

 import java.io.IOException; import java.io.UnsupportedEncodingException; import java.security.AlgorithmParameters; import java.security.GeneralSecurityException; import java.security.NoSuchAlgorithmException; import java.security.spec.InvalidKeySpecException; import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.IvParameterSpec; import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.SecretKeySpec; public class ProtectedConfigFile { public static void main(String[] args) throws Exception { String password = System.getProperty("password"); if (password == null) { throw new IllegalArgumentException("Run with -Dpassword=<password>"); } // The salt (probably) can be stored along with the encrypted data byte[] salt = new String("12345678").getBytes(); // Decreasing this speeds down startup time and can be useful during testing, but it also makes it easier for brute force attackers int iterationCount = 40000; // Other values give me java.security.InvalidKeyException: Illegal key size or default parameters int keyLength = 128; SecretKeySpec key = createSecretKey(System.getProperty("password").toCharArray(), salt, iterationCount, keyLength); String originalPassword = "secret"; System.out.println("Original password: " + originalPassword); String encryptedPassword = encrypt(originalPassword, key); System.out.println("Encrypted password: " + encryptedPassword); String decryptedPassword = decrypt(encryptedPassword, key); System.out.println("Decrypted password: " + decryptedPassword); } private static SecretKeySpec createSecretKey(char[] password, byte[] salt, int iterationCount, int keyLength) throws NoSuchAlgorithmException, InvalidKeySpecException { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA512"); PBEKeySpec keySpec = new PBEKeySpec(password, salt, iterationCount, keyLength); SecretKey keyTmp = keyFactory.generateSecret(keySpec); return new SecretKeySpec(keyTmp.getEncoded(), "AES"); } private static String encrypt(String property, SecretKeySpec key) throws GeneralSecurityException, UnsupportedEncodingException { Cipher pbeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); pbeCipher.init(Cipher.ENCRYPT_MODE, key); AlgorithmParameters parameters = pbeCipher.getParameters(); IvParameterSpec ivParameterSpec = parameters.getParameterSpec(IvParameterSpec.class); byte[] cryptoText = pbeCipher.doFinal(property.getBytes("UTF-8")); byte[] iv = ivParameterSpec.getIV(); return base64Encode(iv) + ":" + base64Encode(cryptoText); } private static String base64Encode(byte[] bytes) { return Base64.getEncoder().encodeToString(bytes); } private static String decrypt(String string, SecretKeySpec key) throws GeneralSecurityException, IOException { String iv = string.split(":")[0]; String property = string.split(":")[1]; Cipher pbeCipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); pbeCipher.init(Cipher.DECRYPT_MODE, key, new IvParameterSpec(base64Decode(iv))); return new String(pbeCipher.doFinal(base64Decode(property)), "UTF-8"); } private static byte[] base64Decode(String property) throws IOException { return Base64.getDecoder().decode(property); } } 

एक समस्या बनी हुई है: पासवर्ड को एन्क्रिप्ट करने के लिए आप का उपयोग किस पासवर्ड को करना चाहिए? आप इसे स्रोत फ़ाइल में संग्रहीत कर सकते हैं और उसे अस्पष्ट कर सकते हैं, लेकिन इसे फिर से ढूंढना बहुत कठिन नहीं है वैकल्पिक रूप से, जब आप जावा प्रोसेस शुरू करते हैं तो आप उसे सिस्टम प्रॉपर्टी के रूप में दे सकते हैं ( -DpropertyProtectionPassword=... )।

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

हां, निश्चित रूप से अपना एल्गोरिथम लिखना नहीं है जावा में बहुत सारे क्रिप्टोग्राफी एपीआई हैं

यदि आपके द्वारा संस्थापित किए गए ओएस में एक कीस्टोर है, तो आप इसका उपयोग अपनी क्रिप्टो कुंजी को संग्रहीत करने के लिए कर सकते हैं, जिसे आपको अपने कॉन्फ़िगरेशन या अन्य फाइलों में संवेदनशील डेटा को एन्क्रिप्ट और डिक्रिप्ट करने की आवश्यकता होगी।

Jasypt की जांच करें, जो न्यूनतम लाइब्रेरी के साथ बुनियादी एन्क्रिप्शन क्षमताओं की पेशकश करते हुए एक पुस्तकालय है।

मुझे लगता है कि सबसे अच्छा तरीका यह सुनिश्चित करना है कि आपकी कॉन्फ़िग फ़ाइल (आपका पासवर्ड युक्त) केवल एक विशिष्ट उपयोगकर्ता खाते के लिए उपलब्ध है उदाहरण के लिए, आपके पास एक ऐप्लिकेशन विशिष्ट उपयोगकर्ता appuser हो सकता है जिसके लिए केवल विश्वसनीय लोगों के पास पासवर्ड होता है (और जिन पर वे su करते हैं)।

इस तरह, कोई परेशानी क्रिप्टोग्राफ़ी ओवरहेड नहीं है और आपके पास अभी भी पासवर्ड है जो सुरक्षित है

संपादित करें: मैं मानता हूं कि आप एक विश्वसनीय वातावरण के बाहर अपने अनुप्रयोग कॉन्फ़िगरेशन का निर्यात नहीं कर रहे हैं (जो मुझे यकीन नहीं है कि कोई भी अर्थ नहीं होगा, सवाल दिया गया है)

मास्टर पासवर्ड की समस्याओं को हल करने के लिए – सबसे अच्छा तरीका पासवर्ड को कहीं भी स्टोर करने के लिए नहीं है, आवेदन को खुद के लिए पासवर्ड एन्क्रिप्ट करना चाहिए – ताकि केवल उन्हें डिक्रिप्ट कर सकें। इसलिए यदि मैं .config फ़ाइल का उपयोग कर रहा था तो मैं निम्नलिखित करता हूँ, mySettings.config :

encryptTheseKeys = secretKey, anotherSecret

secretKey = unprotectedPasswordThatIputHere

anotherSecret = anotherPass

someKey = unprotectedSettingIdontCareAbout

इसलिए मैं एन्क्रिप्ट TheseKeys में बताए गए कुंजी में पढ़ूंगा, ऊपर से Brodwalls उदाहरण को लागू करें और उन्हें किसी प्रकार की मार्कर के साथ फाइल में वापस लिख दें (कहें कि crypt 🙂 आवेदन को यह नहीं करने दें फिर, आउटपुट इस तरह दिखेगा:

encryptTheseKeys = secretKey, anotherSecret

secretKey = क्रिप्ट: ii4jfj304fjhfj934fouh938

एक अन्य गुप्त = क्रिप्ट: jd48jofh48h

someKey = unprotectedSettingIdontCareAbout

बस अपनी खुद की सुरक्षित जगह में मूल रखने के लिए सुनिश्चित करें …

बड़ा बिंदु और कमरे में हाथी और यह सब, यह है कि अगर आपका एप्लिकेशन पासवर्ड पकड़ सकता है, तो बॉक्स पर पहुंच के साथ एक हैकर भी इसे पकड़ सकता है!

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

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

यह सुनिश्चित करने की बात यह है कि पूरी कंपनी को उत्पादन सर्वर (और उसके द्वारा पासवर्ड तक) तक पहुंचने की अनुमति नहीं है, और यह सुनिश्चित कर लें कि यह बॉक्स स्केल करना असंभव है!

मैंने जावा में एक सरल प्रॉपर्टी एनक्रीप्टर बनाया है यह बिल्ड के दौरान आपकी संपत्ति फ़ाइलों को एन्क्रिप्ट कर सकता है। तो आप अपने प्रोग्राम में एन्क्रिप्शनहेल्पर का उपयोग करके इसे डिक्रिप्ट कर सकते हैं। आप इस स्थान पर स्रोत कोड पा सकते हैं http://devpinoy.org/blogs/jakelite/archive/2009/07/14/encrypting-passwords-in-java-property-files.aspx

ESAPIs एन्क्रिप्शन विधियों का उपयोग करके देखें। इसकी कॉन्फ़िगर करने में आसान है और आप आसानी से अपनी चाबियाँ भी बदल सकते हैं।

http://owasp-esapi-java.googlecode.com/svn/trunk_doc/latest/org/owasp/esapi/Encryptor.html

आप

1) एन्क्रिप्ट 2) डिक्रिप्ट 3) साइन 4) हस्ताक्षर 5) हैशिंग 6) समय आधारित हस्ताक्षर और बहुत अधिक सिर्फ एक पुस्तकालय के साथ

आपके द्वारा कॉन्फ़िगरेशन फ़ाइलों की ज़रूरत के मुताबिक सुरक्षित कैसे हो सकता है या आपका एप्लिकेशन कितना विश्वसनीय है, http://activemq.apache.org/encrypted-passwords.html आपके लिए एक अच्छा समाधान हो सकता है

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

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

http://www.eclipse.org/jetty/documentation/current/configuring-security-secure-passwords.html

यदि आप जावा 8 का प्रयोग कर रहे हैं तो बेस 64 एन्कोडर और डीकोडर का उपयोग करके जगह ले जा सकती है

return new BASE64Encoder().encode(bytes);

साथ में

return Base64.getEncoder().encodeToString(bytes);

तथा

return new BASE64Decoder().decodeBuffer(property);

साथ में

return Base64.getDecoder().decode(property);

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

टिप्पणियों के आधार पर मैंने तालरे डेटा एकीकरण का इस्तेमाल करते हुए प्रलेखन विन्यास फाइलों में सिफर / क्रिप्ट और अनक्रिप पासवर्ड को कैसे ट्यूटोरियल लिखा है।

यह फ्रांसीसी में है, लेकिन जैशप या जोहान्स के उपरोक्त उदाहरण के आधार पर दो तरीकों का प्रस्ताव है। कोड आपको रूचि कर सकता है