[java] JPasswordField में GetText () को बहिष्कृत क्यों किया गया था?



1 Answers

इसका कारण यह है कि यदि आप एक वर्ण सरणी के बजाए पासवर्ड को स्ट्रिंग के रूप में पूछते हैं, तो पासवर्ड युक्त यह स्ट्रिंग अब कुछ रन-टाइम समय के लिए जावा रनटाइम की मेमोरी में तैरने जा रही है। यह एक दुष्ट जावा घटक या बाहरी कार्यक्रम द्वारा वहां से अनुमानित रूप से पढ़ा जा सकता है।

इसके बजाए एक चार सरणी का उपयोग करके, आप पासवर्ड सत्यापित कर सकते हैं और फिर तुरंत इसे स्कैम्बल कर सकते हैं।

Question

मैंने पहले कभी नहीं सोचा था, केवल मैंने विधि को getPassword किया था, जो कि वर्णों की एक सरणी लौटा रहा था और मैंने देखा था कि getPassword विधि को बहिष्कृत किया गया था। लेकिन अब मुझे लगता है कि, इस विधि को क्यों हटा दिया गया था?

जावा दस्तावेज बताता है:

बहिष्कृत जावा 2 प्लेटफार्म v1.2 के रूप में, getPassword द्वारा प्रतिस्थापित किया getPassword

घटक द्वारा प्रतिनिधित्व पाठ का एक हिस्सा प्राप्त करता है। लंबाई 0 है तो एक खाली स्ट्रिंग देता है।

सुरक्षा कारणों से, इस विधि को बहिष्कृत किया गया है। इसके बजाय getPassword विधि का उपयोग करें।

लेकिन उन सुरक्षा कारण क्या हैं? इस बारे में कोई विचार?

पहले ही, आपका बहुत धन्यवाद।




इस व्यवहार के पीछे कारण जावा स्ट्रिंग पूल है (उदाहरण के लिए अधिक जानकारी के लिए यह SO प्रश्न देखें)। जैसे ही आप उस पासवर्ड फ़ील्ड की सामग्री को String परिवर्तित करते हैं (जो होता है यदि आप getText विधि का उपयोग करते हैं तो) String पूल में रखी जाती है, और इसे दूसरों द्वारा पढ़ा जा सकता है।

यदि आप getPassword विधि के कार्यान्वयन को getPassword (जैसा कि आपके प्रश्न पर टिप्पणी के रूप में पोस्ट किए गए SO सवाल @ गारबेज में देखा जा सकता है) तो आप इसे String बनाने से सावधानी से बचा सकते हैं।

ध्यान दें कि इसका मतलब यह भी है कि आपको ऐसा कुछ नहीं करना चाहिए

if ( Arrays.equals( "mySuperSecretPassword".toCharArray(), passwordField.getPassword() ) )

या आप अभी भी पूल में पासवर्ड डालने के साथ समाप्त हो जाते हैं, और फिर आप आसानी से getText विधि का उपयोग कर सकते हैं।




Related