कई चीजों के साथ, आप प्रतिबिंब का उपयोग करके इसे प्राप्त कर सकते हैं। और चूंकि आप प्रतिबिंब का उपयोग कर रहे हैं, यह सुंदर नहीं होगा (केवल उन सभी अपवादों को देखें), लेकिन मुझे लगता है कि यह अभी एकमात्र तरीका है।
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;
}
}
Content
getContent()
द्वारा दिया हमेशा उदाहरण के javafx.scene.control.TextField$TextFieldContent
तो यह characters
क्षेत्र तक पहुँचने के लिए सुरक्षित है।
तो क्या आप जिंदा रहने वाले पासवर्ड के बारे में चिंतित हैं क्योंकि यह स्ट्रिंग के जेवीएम पूल में जोड़ा जा सकता है? मैं बस सोच रहा हूं: भले ही आप पासवर्डफिल्ड से वर्णों की एक सरणी पुनर्प्राप्त कर सकें ... जो इस घटक को आंतरिक रूप से स्ट्रिंग का उपयोग करने से नहीं रोकती है; और फिर आप कुछ हासिल नहीं करेंगे। – GhostCat
दाएं, यह मानक टेक्स्टफिल्ड बढ़ाता है, लेकिन मुझे उम्मीद है कि जावाएसई में जेपीएएसवर्डफिल्फ़ जैसे सुरक्षित संस्करण मौजूद हैं .. – Krzysiek
मुझे लगता है कि प्रश्न मान्य है, क्योंकि पासवर्ड के लिए एक चार सरणी का उपयोग करना अनुशंसित दृष्टिकोण है। 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