2014-09-30 3 views
7

मैं जेवीएम (क्लोजर में) के लिए सॉफ्टवेयर लिख रहा हूं जो क्रिप्टोग्राफिक ऑपरेशन करता है। विशेष रूप से, एक गुप्त इनपुट, गुप्त कुंजी, गैर गुप्त नमक, गैर गुप्त निजीकरण दिया जाता है, यह मुख्य सामग्री के 512 बिट प्राप्त करने के लिए ब्लैक 2 का उपयोग करता है। यह Arrays कक्षा से उपकरण का उपयोग करके, उस सरणी को दो 256 बिट भागों में चॉप करता है। (source)मैं JVM पर सुरक्षित रूप से हैंडल और शून्य कुंजी सामग्री बफर कैसे कर सकता हूं?

कि आपरेशन के वास्तविक क्रियान्वयन libsodium तो यह सी में लागू हो, तो मुझे इसे उपयोग करने में है, जो kalium पर एक आवरण, jnr-ffi का उपयोग करता है अंतर्निहित सी कार्यान्वयन कॉल करने के लिए एक पुस्तकालय है caesium उपयोग कर रहा हूँ में रहती है।

चूंकि उपरोक्त सभी बफरों में संवेदनशील कुंजी सामग्री है, इसलिए मैं यह सुनिश्चित करना चाहता हूं कि यह स्मृति से शुद्ध हो। मुझे यकीन नहीं है कि JVM पर सुरक्षित रूप से ऐसा कैसे करें (हेक, मुझे यह भी यकीन नहीं है कि मुझे how to do that safely in C पता है)। यह देखते हुए कि सामग्री का अनुवाद const char * से JVM byte[] तक किया गया है, और फिर मेरे कुछ ऑपरेशन नए जेवीएम बाइट एरे बनाते हैं, मुख्य सामग्री जेवीएम बाइट एरे में रहती है। यही कारण है कि दो चिंता जाहिर करता है:

  • अगर मैं एक byte[] है, जो बाद में किसी भी कोड से छुआ नहीं है zerofill, कैसे मुझे यकीन है कि byte[] वास्तव में बाहर ध्यान केंद्रित किया गया था हो सकता है? मुझे लगता है कि JVM उस को अनुकूलित करने के लिए स्वतंत्र है।
  • भले ही मैं byte[] की गारंटी देने में सक्षम था, मुझे पता भी चलेगा कि जेवीएम ने उस सरणी को कॉपी करने का निर्णय नहीं लिया है (उदाहरण के लिए कचरा कलेक्टर के संदर्भ में) मूल स्थान को शून्य किए बिना कई बार, इसलिए कुंजीपटल सामग्री को वर्चुअल मेमोरी में छोड़कर वैसे भी?

मेरा अनुमान है कि इस सवाल का जवाब 'सी & एएसएम में यह है "जा रहा है खत्म हो जाएगा या शायद" एक HSM में कर ", लेकिन मैंने सुना है कि अगर वहाँ की JVM-भूमि तरीके हैं अच्छा लगेगा इस समस्या को ठीक करना

+3

यदि 'बाइट []' का संदर्भ उस विधि के दायरे के बाहर प्रकाशित किया गया है जहां इसे बनाया गया था, तो JVM ऑप्टिमाइज़र आपके इंटर-थ्रेड लेखन कार्यों को अनदेखा करने का निर्णय नहीं ले सकता है। हालांकि, आपका दूसरा बिंदु पूरी तरह से मान्य है और शायद इसके बारे में आप कुछ भी नहीं कर सकते हैं। –

+4

यदि आपने प्रत्यक्ष 'बाइटबफर' के खिलाफ कोड किया है, जो गैर-ढेर स्मृति आवंटित करता है, तो हो सकता है कि आप जीसी के बारे में बिंदु के बारे में बेहतर स्थिति में हों। 'असुरक्षित' वर्ग से कुछ भी उपयोगी साबित हो सकता है। –

+0

आपकी टिप्पणियों के लिए धन्यवाद, @MarkoTopolnik। क्या आप सुनिश्चित हैं कि JVM को उस स्थान को ऑप्टिमाइज़ करने की अनुमति नहीं है यदि संदर्भ एक से अधिक स्थानों पर दिखाई दे रहा है, भले ही यह साबित हो सके कि शून्य के बाद उस संदर्भ को और कुछ नहीं छूता है? सी कंपाइलर्स से यह व्यवहार प्राप्त करना, उदाहरण के लिए, काफी मुश्किल हो जाता है। (यानी, उन्हें शून्य-आउट को दूर करने से रोकना है।) – lvh

उत्तर

1

यदि आपको केवल एक सरणी को साफ़ करना है, Arrays.fill एक नई सरणी आवंटित नहीं करता है लेकिन पैरामीटर के रूप में पारित किए गए मानों को बदलता है। यदि आप स्रोत डाउनलोड करते हैं तो आप इसे सीधे पढ़ सकते हैं।

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

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