2012-05-04 28 views
22

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

जावा प्रलेखन बताते हैं:

पदावनतजावा 2 मंच v1.2 के रूप में, getPassword द्वारा बदल दिया।

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

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

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

अग्रिम धन्यवाद।

+2

http: // stackoverflow।कॉम/प्रश्न/983964/क्यों-करता-jpasswordfield-getpassword-create-a-string-with-the-password-in- – Garbage

उत्तर

36

getText पर कॉल करते समय आपको एक स्ट्रिंग (अपरिवर्तनीय वस्तु) मिलती है जिसे बदला नहीं जा सकता है (प्रतिबिंब को छोड़कर) और इसलिए पासवर्ड कचरा एकत्र होने तक स्मृति में रहता है।

जब getPassword बुला आप एक चार सरणी है कि संशोधित किया जा सकता हो, तो पासवर्ड वास्तव में स्मृति में नहीं रहना होगा।

8

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

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

5

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

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

नोट यह भी मतलब है कि आप की तरह

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

कुछ ऐसा नहीं करना चाहिए या आप अभी भी पूल में पासवर्ड डाल के साथ खत्म हो, और फिर आप के रूप में आसानी getText विधि का इस्तेमाल किया जा सकता था।

+0

"जावा स्ट्रिंग पूल" संकलन समय पर इंटर्न के स्थिरांक के लिए है .. मैं सवाल करता हूं कि क्या एक मानक स्विंग पाठ इनपुट * वास्तव में * इंटर्न पाठ मूल्य इसमें प्रवेश किया। मेरी समझ यह होगी कि अपरिवर्तनीय स्ट्रिंग की बजाय एक char [] सरणी लौटने से पासवर्ड को काम करने की स्मृति (सुरक्षा सर्वोत्तम अभ्यास) में एक्सपोजर/दृश्यता को कम करने के लिए तुरंत शून्य आउट किया जा सकता है। स्ट्रिंग को किसी भी तरह से 'इंटर्न' होने की उम्मीद नहीं की जाएगी। –

5

इस प्रयास करें:

String myPass=String.valueOf(passwordField.getPassword()); 
+1

ओपी नहीं पूछ रहा है * पासवर्ड को 'स्ट्रिंग' * के रूप में कैसे प्राप्त करें; वह पूछ रहा है * पासवर्ड 'स्ट्रिंग' के बजाय 'CharrArray' के रूप में क्यों लौटाया जाता है। – Barranka

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