2011-05-20 32 views
6

मैं एक शुरुआती जावा प्रोग्रामर हूं। मैं ऐसे एप्लिकेशन पर काम कर रहा हूं जो कुछ डेटा को डिक्रिप्ट करता है। डिक्रिप्शन कुंजी सॉफ़्टवेयर में हार्डकोड की गई है और इस प्रकार बाइटकोड का विश्लेषण करके देखा जा सकता है।डिक्रिप्शन से डिक्रिप्शन कुंजी की रक्षा कैसे करें?

मुझे पता है कि रिवर्स इंजीनियरिंग पूरी तरह से रोका नहीं जा सकता है, इसलिए मैं प्रक्रिया को जितना संभव हो सके उतना कठिन बनाने के लिए प्रयास कर रहा हूं।

मेरा विचार सीधे मेरे कोड में कुंजी डालना नहीं है, लेकिन इसे किसी प्रकार के परिवर्तन के माध्यम से जाना है। उदाहरण के लिए, मैं लिख सकता है -

private static final byte[] HC256A = Hex 
      .decode("8589075b0df3f6d82fc0c5425179b6a6" 
        + "3465f053f2891f808b24744e18480b72" 
        + "ec2792cdbf4dcfeb7769bf8dfa14aee4" 
        + "7b4c50e8eaf3a9c8f506016c81697e32"); 

इस तरह किसी को बाईटकोड को देखकर यह सीधे नहीं पढ़ सकता। लेकिन तर्क का पालन करना होगा और इसमें परिवर्तन लागू करना होगा, जो बाइट स्तर पर इतना आसान नहीं होगा।

तो आप लोग क्या सोचते हैं? क्या यह उपयोगी है? हेक्स डिकोडिंग के अलावा सबसे अच्छा परिवर्तन क्या हो सकता है? क्या हार्डकोडेड डिक्रिप्शन कुंजी की सुरक्षा के लिए कोई अन्य विधियां उपलब्ध हैं?

आपके सभी सुझावों के लिए धन्यवाद।

+2

आप डीबगर कनेक्टिंग (सी ++ में काम करते हैं, यह सुनिश्चित नहीं करते कि जावा में ऐसा कैसे करें) के लिए सुन सकते हैं, और यदि ऐसा है, तो स्मृति से मान हटाएं। –

+0

डीकोड किए जाने वाले डेटा की संवेदनशीलता क्या है? यह उस डेटा की सुरक्षा में कितना प्रयास करने के लिए एक गाइड के रूप में कार्य करने में मदद करेगा। बाइटकोड में कुंजी छिपाने का कोई भी रूप हारने के लिए अपेक्षाकृत आसान है। इसके अतिरिक्त यह आवश्यक होगा कि सॉफ़्टवेयर के प्रत्येक उपयोगकर्ता की एक ही कुंजी हो और कुंजी में बदलने के लिए पुन: संकलन की आवश्यकता हो। –

+0

डेटा काफी संवेदनशील है। यह एक डिजिटल मीडिया प्रिंट है जो लीक होने पर कंपनी के लिए गंभीर समस्याएं पैदा करेगा। –

उत्तर

8

इस तरह के obfuscation (विशेष रूप से बाइटकोड भाषाओं में) पर हमला करने का सही तरीका उस स्थान पर डीबगर संलग्न करना है जिस पर कुंजी पारित की जाती है (यदि डीबगिंग संभव नहीं है, तो उस स्थान से कोड का विश्लेषण शुरू करें)। इस तरह हमलावर को कुंजी की तलाश करने की आवश्यकता नहीं होती है और वह परवाह नहीं करता कि कुंजी कितनी खराब है। तो आपको अपने डिजाइन को फिर से सोचने की जरूरत है।

यदि आप केवल शौकिया लर्कर्स से रक्षा करना चाहते हैं, तो कुंजी को विभाजित करना और इसके हिस्सों को एक्सओर करना (संभवतः विभिन्न कुंजियों के साथ) पर्याप्त होगा। एक और चाल - कोड में पहले से मौजूद पाठ स्थिरांक से कुंजी प्राप्त करें (जैसे एप्लिकेशन नाम)। इससे विभाजन या XORING की तुलना में कुंजी कम स्पष्ट होती है।

+1

+1 'प्राप्त करने के लिए' – sehe

+0

+1 के लिए +1 ** ** ** आपको यह क्यों नहीं करना चाहिए ** और ** इसे कैसे करना चाहिए ;-) –

+0

@ जोचिम वास्तव में दो हिस्सों में हमलावरों के अलग-अलग सेट शामिल हैं :) –

0

इसी तरह की समस्या के साथ सामना करना पड़ा (सी में) मैं एकल उपयोग एक्सओआर पैड के साथ चला गया। यह अच्छा है क्योंकि यह कचरा जैसा दिखता है ... यदि आप वास्तव में चालाक हो जाते हैं तो आप उपयोग में उस (गलत) कुंजी के लिए स्नूप कर सकते हैं। मैं ऐसी चीज से बचूंगा जो मानव पठनीय तारों को इंजेक्ट करे क्योंकि वे हमेशा उस कोड के ध्यान पर ध्यान आकर्षित करेंगे।

+2

कुछ बिट-स्थानांतरण के साथ एक्सओआर पैड जितना संभव हो उतना अच्छा होता है: यह वास्तव में * अच्छा * रोकथाम नहीं है, लेकिन यह उन लोगों को विफल करता है जो आसानी से 'जाव' कहते हैं और कुंजी की सीधी डंप प्राप्त करने की उम्मीद करते हैं। –

3

स्रोत कोड में कुंजी को कोड न करें। इसे अलग रखें, इसे अलग से शिप करें, उदा। जावा कीस्टोर में, और केवल उन ग्राहकों/साइटों/ग्राहकों के लिए जिन पर आप भरोसा करते हैं, और लाइसेंस में कुछ कानूनी व्यवस्थाएं डालती हैं जो कि उन पर रखती हैं यदि वे कीस्टोर को रिसाव करते हैं।

+0

और आप कुंजी को अपने कोड में कीस्टोर में कैसे स्टोर करते हैं? – raymi