2010-08-10 3 views
11

मैं जावा प्रमाणन पुस्तकों में से एक में java.io.Console कक्षा के बारे में पढ़ रहा था, संभवतः मैंने पिछले अध्याय से कुछ मौलिक याद किया है, लेकिन क्या कोई नीचे बता सकता है?जावा कंसोल; readPassword, एक सरणी पासवर्ड मान निर्धारित करने से कैसे रक्षा करती है?

यह उल्लेख करता है कि readPassword विधि स्ट्रिंग के बजाय एक वर्ण सरणी देता है, ताकि संभावित हैकर को इस स्ट्रिंग को ढूंढने और फिर पासवर्ड ढूंढने से रोका जा सके।

एक चरित्र सरणी कैसे सुरक्षित है? यदि आप सरणी में मान प्राप्त कर सकते हैं तो क्या आप विभिन्न संयोजनों के माध्यम से लूप करने के लिए एक स्क्रिप्ट नहीं बना सकते हैं और अंत में पासवर्ड भी खोज सकते हैं?

उत्तर

12

documentation से:

कंसोल ऑब्जेक्ट को उसके readPassword विधि के माध्यम से सुरक्षित पासवर्ड प्रविष्टि का समर्थन करता है। यह विधि दो तरीकों से सुरक्षित पासवर्ड प्रविष्टि में मदद करती है। सबसे पहले, यह गूंजता दबाता है, इसलिए उपयोगकर्ता की स्क्रीन पर पासवर्ड दिखाई नहीं देता है। दूसरा, readPassword स्ट्रिंग नहीं, एक वर्ण सरणी देता है, इसलिए पासवर्ड को ओवरराइट किया जा सकता है, इसे जितनी जल्दी हो सके उतनी ही स्मृति से हटाया जा सकता है।

विचार यहाँ है कि आप Arrays.fill (या समतुल्य) के लिए "रिक्त" चार सरणी जैसे ही आप पासवर्ड मान्य कर दिया है कॉल कर सकते हैं है, और उस बिंदु से पासवर्ड नहीं रह गया है स्मृति में संग्रहीत किया जाता है। चूंकि स्ट्रिंग्स अपरिवर्तनीय हैं, स्ट्रिंग ढेर में तब तक रहेगी जब तक कि यह कचरा इकट्ठा न हो - जो कि यदि यह स्वयं को प्रशिक्षित करने का प्रबंधन करता है तो कभी नहीं होगा, और किसी भी अन्य मामले में अभी भी "बहुत लंबा" हो सकता है। जब भी यह वहां होता है, यह विभिन्न प्रकार के वैक्टरों से स्नीफ करने के लिए संभावित रूप से कमजोर है।

2

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

4

यह उन सर्वोत्तम अभ्यास चीजों में से एक है। यह बहुत अधिक समझ में नहीं आता है, लेकिन हम इसे एक आसान जीवन के लिए करते हैं।

यदि कोई पासवर्ड स्मृति में है, तो बफर पढ़ने वाले ओवरफ़्लो को इसे पढ़ने की अनुमति मिल सकती है। या इसे कोर डंप या हाइबरनेशन छवि में सहेजा जा सकता है। एक परिवर्तनीय char[] का उपयोग डेटा को नष्ट करने की अनुमति देता है, उम्मीदवार संकीर्ण खिड़की के बाद, जब तक इसे किसी स्ट्रिंग में कॉपी नहीं किया जाता है, तब तक यह कहीं और कॉपी किया जाता है, यह शायद बफर में होता है, कचरा संग्रह वस्तुओं को स्थानांतरित करने के लिए पसंद करता है, आदि

स्विंग में एक मनोरंजक उदाहरण है, जहां JPasswordField डेटा पढ़ने के लिए char[] तरीका प्रदान करता है, लेकिन उदाहरण के लिए यदि डेटा एक्शन श्रोता (जो इसका उपयोग करने का एक बहुत ही आम तरीका है) डेटा से String बना देगा।

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