JavaFX

2015-03-31 13 views
19

में पासवर्डफ़ील्ड से पासवर्ड प्राप्त करने का सुरक्षित तरीका जावाएफएक्स 8 में पासवर्डफ़ील्ड से पासवर्ड को सुरक्षित रूप से पुनर्प्राप्त करने का कोई तरीका है, इसलिए यह स्मृति में सहेजा नहीं गया है?JavaFX

स्टैंडर्ड विकल्प:

String pass = passwordField.getText(); 

मेरे लिए पर्याप्त नहीं है। मुझे ऐसा कुछ उम्मीद है:

char[] pass = passwordField.getPassword(); 
+1

तो क्या आप जिंदा रहने वाले पासवर्ड के बारे में चिंतित हैं क्योंकि यह स्ट्रिंग के जेवीएम पूल में जोड़ा जा सकता है? मैं बस सोच रहा हूं: भले ही आप पासवर्डफिल्ड से वर्णों की एक सरणी पुनर्प्राप्त कर सकें ... जो इस घटक को आंतरिक रूप से स्ट्रिंग का उपयोग करने से नहीं रोकती है; और फिर आप कुछ हासिल नहीं करेंगे। – GhostCat

+1

दाएं, यह मानक टेक्स्टफिल्ड बढ़ाता है, लेकिन मुझे उम्मीद है कि जावाएसई में जेपीएएसवर्डफिल्फ़ जैसे सुरक्षित संस्करण मौजूद हैं .. – Krzysiek

+0

मुझे लगता है कि प्रश्न मान्य है, क्योंकि पासवर्ड के लिए एक चार सरणी का उपयोग करना अनुशंसित दृष्टिकोण है। JPasswordField द्वारा (https://docs.oracle.com/javase/8/docs/api/javax/swing/JPasswordField.html#getPassword--) और पासवर्डकॉलबैक द्वारा (https://docs.oracle.com/javase/8 /docs/api/javax/security/auth/callback/PasswordCallback.html#getPassword--) – Puce

उत्तर

1

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

public class SafePasswordField extends PasswordField { 

    public final char[] getPassword() throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException { 
     Content c = getContent(); 

     Field fld = c.getClass().getDeclaredField("characters"); 
     fld.setAccessible(true); 

     StringBuilder sb = (StringBuilder) fld.get(c); 
     char[] result = new char[sb.length()]; 
     sb.getChars(0, sb.length(), result, 0); 

     return result; 
    } 

} 

ContentgetContent() द्वारा दिया हमेशा उदाहरण के javafx.scene.control.TextField$TextFieldContent तो यह characters क्षेत्र तक पहुँचने के लिए सुरक्षित है।

2

कोई फर्क नहीं पड़ता कि परिवर्तनीय प्रकार क्या है (स्ट्रिंग, char [] ...) यह हमेशा कचरा कलेक्टर इसे उठाए जाने तक स्मृति में संग्रहीत किया जाएगा। जबकि मुझे लगता है कि यह थोड़ा मुश्किल होगा, आपको एक प्रोग्राम बनाना होगा और पासवर्ड को पुनः प्राप्त करने के लिए वेरिएबल के डेटा वाले मेमोरी स्पेस को पढ़ना होगा। अगर मैं आप थे तो मैं किसी भी छिपाने के बारे में चिंतित नहीं होगा :)

+3

सहमत - इस http://security.stackexchange.com/questions/29019/are-passwords-stored-in-memory-safe?rq=1 – Metatron

+0

@Tron बहुत दिलचस्प और प्रासंगिक आलेख के बारे में वास्तव में एक अच्छा विषय है! निश्चित रूप से एक लायक लायक है। –

+0

लेकिन यदि आप इसे एक चार सरणी के रूप में संग्रहीत करते हैं तो आप सरणी को ओवरराइट करने का निर्णय ले सकते हैं उदाहरण के लिए 0s 'इसका उपयोग समाप्त हो जाने के बाद। जीसी चलाने के लिए इंतजार करने के विरोध में (जिसे आप नियंत्रित नहीं कर सकते) – niclaslindgren