मेरी चिंता यह है कि कचरा कलेक्टर द्वारा प्रबंधित क्रिप्टोग्राफिक कुंजी और रहस्य कॉपी किए जा सकते हैं और शून्यकरण के बिना स्मृति में चारों ओर स्थानांतरित हो सकते हैं।मैं कैसे सुनिश्चित कर सकता हूं कि जावा ऑब्जेक्ट (क्रिप्टोग्राफिक सामग्री युक्त) शून्यकृत है?
public class Key {
private char[] key;
// ...
protected void finalize() throws Throwable {
try {
for(int k = 0; k < key.length; k++) {
key[k] = '\0';
}
} catch (Exception e) {
//...
} finally {
super.finalize();
}
}
// ...
}
संपादित करें:
एक संभव समाधान के रूप में, यह करने के लिए पर्याप्त है कृपया ध्यान दें कि मेरी समस्या वस्तु की आधिकारिक (संदर्भित) प्रतिलिपि का न केवल zeroization के बारे में है, लेकिन यह भी किसी भी बासी प्रतियां कचरा कलेक्टर हो सकता है जबकि यह अंतरिक्ष और गति दक्षता के लिए स्मृति चारों ओर shuffles।
सबसे सरल उदाहरण मार्क-एंड-स्वीप जीसी है, जहां वस्तुओं को 'संदर्भित' के रूप में चिह्नित किया जाता है और फिर उन सभी वस्तुओं को दूसरे क्षेत्र में कॉपी किया जाता है। बाकी तब कचरा होते हैं और इसलिए वे एकत्र किए जाते हैं। जब प्रतिलिपि होती है, तो वह अवशिष्ट कुंजी डेटा छोड़ सकता है जिसे अब कचरा कलेक्टर द्वारा प्रबंधित नहीं किया जा रहा है (क्योंकि 'आधिकारिक' डेटा नए क्षेत्र में है)।
इसके लिए एक लिटमस परीक्षण होगा यदि आप क्रिप्टो मॉड्यूल में एक कुंजी का उपयोग करते हैं, कुंजी को शून्यकृत करते हैं, फिर पूरे जेवीएम प्रक्रिया स्थान का निरीक्षण करते हैं, तो आपको उस कुंजी को ढूंढना चाहिए।
मैंने चारों ओर देखा, लेकिन मुझे जीसी डेटा तक पहुंचने का कोई तरीका नहीं मिला। मैं जवाब दूंगा कि विशेषता और उसके मूल्य के बीच संदर्भ को हटाकर, इसे फिर से एक्सेस करने का कोई तरीका नहीं है, लेकिन मुझे शक नहीं है, क्योंकि आपको यह संदेह था। – marionmaiden
मूल जावा वस्तुओं के साथ आप जो चाहते हैं उसे करने के लिए मूल रूप से कोई रास्ता नहीं है (वर्तमान में)। – james
वास्तव में यह सुनिश्चित नहीं है कि बिंदु क्या है। जानकारी स्मृति _somewhere_ में है।अगर किसी हमलावर के पास स्थानीय मेमोरी तक पहुंच है, तो आप बहुत ज्यादा अटक गए हैं। – james