ऑबफसकेशन (सॉफ़्टवेयर)

सॉफ़्टवेयर विकास में, कहानियो स्रोत कोड या मशीन कोड बनाने का कार्य है जिसे मनुष्य या कंप्यूटर के लिए समझना मुश्किल होता है। प्राकृतिक भाषा में अस्पष्टता की तरह, यह कथन लिखने के लिए अनावश्यक रूप से गोल-मटोल अभिव्यक्तियों का उपयोग कर सकता है। प्रोग्रामर जानबूझकर कोड को उसके उद्देश्य (अस्पष्टता के माध्यम से सुरक्षा) या उसके तर्क या उसमें निहित अंतर्निहित मूल्यों को छिपाने के लिए अस्पष्ट कर सकते हैं, मुख्य रूप से छेड़छाड़ को रोकने, रिवर्स इंजीनियरिंग को रोकने या यहां तक ​​कि स्रोत कोड पढ़ने वाले किसी व्यक्ति के लिए एक पहेली या मनोरंजक चुनौती बनाने के लिए। यह मैन्युअल रूप से या स्वचालित उपकरण का उपयोग करके किया जा सकता है, बाद वाला उद्योग में पसंदीदा तकनीक है।

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

वे गुण जो किसी भाषा को अस्पष्ट बनाते हैं वे तुरंत स्पष्ट नहीं होते हैं।

तकनीक
अस्पष्टता के प्रकारों में सरल कीवर्ड प्रतिस्थापन, कलात्मक प्रभाव बनाने के लिए व्हाइटस्पेस का उपयोग या गैर-उपयोग, और स्व-उत्पन्न या भारी संपीड़ित कार्यक्रम शामिल हैं।

निक मोंटफोर्ट के अनुसार, तकनीकों में शामिल हो सकते हैं:
 * 1) नामकरण अस्पष्टता, जिसमें अर्थहीन या भ्रामक तरीके से चर का नामकरण शामिल है;
 * 2) डेटा/कोड/टिप्पणी भ्रम, जिसमें कुछ वास्तविक कोड को टिप्पणियों जैसा बनाना या डेटा के साथ भ्रमित करने वाला सिंटैक्स बनाना शामिल है;
 * 3) डबल कोडिंग, जो काव्य रूप या दिलचस्प आकृतियों में कोड प्रदर्शित कर सकती है।

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

यद्यपि अधिकांश व्यावसायिक ऑबफस्केशन समाधान या तो प्रोग्राम स्रोत कोड, या प्लेटफ़ॉर्म-स्वतंत्र बाइटकोड को परिवर्तित करके काम करते हैं जैसा कि जावा और .NET द्वारा उपयोग किया जाता है, कुछ ऐसे भी हैं जो सीधे संकलित बायनेरिज़ पर काम करते हैं।


 * कुछ पायथन (प्रोग्रामिंग भाषा) उदाहरण आधिकारिक पायथन प्रोग्रामिंग FAQ और अन्यत्र पाए जा सकते हैं।
 * X86|x86_32 ISA के लिए movfuscator C (प्रोग्रामिंग भाषा) संकलक  अस्पष्ट करने के लिए केवल X86 निर्देश सूची निर्देश का उपयोग करता है।

मनोरंजक
अस्पष्ट स्रोत कोड लिखना और पढ़ना दिमाग को तनाव देने वाला हो सकता है। कई प्रोग्रामिंग प्रतियोगिताएं सबसे रचनात्मक रूप से अस्पष्ट कोड को पुरस्कृत करती हैं, जैसे कि अंतर्राष्ट्रीय ओफ़्फ़ुसेटेड सी कोड प्रतियोगिता और ओफ़्फ़ुसेटेड पर्ल प्रतियोगिता।

पर्ल प्रोग्रामर्स के हस्ताक्षर खंड  में लघु अस्पष्ट पर्ल प्रोग्राम का उपयोग किया जा सकता है। ये JAPH (सिर्फ एक और पर्ल हैकर) हैं।

क्रिप्टोग्राफ़िक
क्रिप्टोग्राफ़रों ने कोड को अस्पष्ट करने के विचार का पता लगाया है ताकि कोड को रिवर्स-इंजीनियरिंग करना क्रिप्टोग्राफ़िक रूप से कठिन हो। इसे अविभाज्यता अस्पष्टता के कई प्रस्तावों में औपचारिक रूप दिया गया है, एक क्रिप्टोग्राफ़िक आदिम, जिसे यदि सुरक्षित रूप से बनाना संभव हो, तो किसी को कई अन्य प्रकार की क्रिप्टोग्राफी का निर्माण करने की अनुमति मिल जाएगी, जिसमें पूरी तरह से नए प्रकार भी शामिल हैं जिन्हें कोई नहीं जानता कि कैसे बनाया जाए। (एक मजबूत धारणा, ब्लैक-बॉक्स अस्पष्टता, सामान्य तौर पर असंभव मानी जाती है।)

आक्षेप के नुकसान

 * जबकि अस्पष्टता पढ़ने, लिखने और रिवर्स-इंजीनियरिंग को एक कार्यक्रम को कठिन और समय लेने वाली बना सकती है, लेकिन जरूरी नहीं कि यह इसे असंभव बना दे।
 * यह डेवलपर्स के लिए निर्माण प्रक्रिया में समय और जटिलता जोड़ता है।
 * सॉफ़्टवेयर के अस्पष्ट हो जाने के बाद यह डिबगिंग संबंधी समस्याओं को अत्यंत कठिन बना सकता है।
 * एक बार जब कोड एबंडवेयर बन जाता है और उसका रखरखाव नहीं किया जाता है, तो शौकीन लोग प्रोग्राम को बनाए रखना चाहते हैं, मॉड जोड़ना चाहते हैं, या इसे बेहतर ढंग से समझना चाहते हैं। अस्पष्टता के कारण अंतिम उपयोगकर्ताओं के लिए कोड के साथ उपयोगी कार्य करना कठिन हो जाता है।
 * कुछ प्रकार की अस्पष्टता (यानी कोड जो सिर्फ एक स्थानीय बाइनरी नहीं है और आवश्यकतानुसार वेब सर्वर से मिनी बाइनरी डाउनलोड करता है) प्रदर्शन को ख़राब कर सकता है और/या इंटरनेट की आवश्यकता हो सकती है।

उपयोगकर्ताओं को अस्पष्ट कोड के बारे में सूचित करना
कुछ एंटीवायरस सॉफ़्टवेयर, जैसे AVG एंटीवायरस, यह अपने उपयोगकर्ताओं को तब भी सचेत करेगा जब वे मैन्युअल रूप से अस्पष्ट किए गए कोड वाली किसी वेबसाइट पर पहुंचेंगे, क्योंकि अस्पष्टता का एक उद्देश्य दुर्भावनापूर्ण कोड को छिपाना भी हो सकता है। हालाँकि, कुछ डेवलपर फ़ाइल आकार को कम करने या सुरक्षा बढ़ाने के उद्देश्य से कोड अस्पष्टता का उपयोग कर सकते हैं। औसत उपयोगकर्ता यह अपेक्षा नहीं कर सकता है कि उसका एंटीवायरस सॉफ़्टवेयर किसी अन्यथा हानिरहित कोड के बारे में अलर्ट प्रदान करेगा, विशेष रूप से विश्वसनीय निगमों से, इसलिए ऐसी सुविधा वास्तव में उपयोगकर्ताओं को वैध सॉफ़्टवेयर का उपयोग करने से रोक सकती है।

मोज़िला और Google अपने ऐड-ऑन स्टोर में अस्पष्ट कोड वाले ब्राउज़र एक्सटेंशन को अनुमति नहीं देते हैं।

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

decompiler ्स
एक डिकंपाइलर एक निष्पादन योग्य या लाइब्रेरी से स्रोत कोड को रिवर्स-इंजीनियर कर सकता है। डिकंपाइलेशन को कभी-कभी मैन-इन-द-एंड (माइट) हमला कहा जाता है, जो पारंपरिक क्रिप्टोग्राफ़िक हमले पर आधारित है जिसे बीच-बीच में हमला|मैन-इन-द-मिडिल के रूप में जाना जाता है। यह स्रोत कोड को उपयोगकर्ता के हाथों में रखता है, हालाँकि इस स्रोत कोड को पढ़ना अक्सर मुश्किल होता है। स्रोत कोड में यादृच्छिक फ़ंक्शन और परिवर्तनीय नाम, गलत चर प्रकार और मूल स्रोत कोड (कंपाइलर अनुकूलन के कारण) की तुलना में भिन्न तर्क का उपयोग होने की संभावना है।

मॉडल अस्पष्टता
मॉडल ऑबफस्केशन यंत्र अधिगम  मॉडल की आंतरिक संरचना को छिपाने की एक तकनीक है। अस्पष्टता एक मॉडल को ब्लैक बॉक्स में बदल देती है। यह समझाने योग्य एआई के विपरीत है।

यह भी देखें

 * एएआरडी कोड
 * स्पेगेटी कोड
 * केवल लिखने योग्य भाषा
 * विघटन
 * गूढ़ प्रोग्रामिंग भाषा
 * क्विन (कंप्यूटिंग)
 * ओवरलैपिंग निर्देश
 * बहुरूपी कोड
 * हार्डवेयर अस्पष्टता
 * अंडरहैंडेड सी प्रतियोगिता
 * स्रोत-से-स्रोत संकलक
 * प्रोगार्ड (सॉफ्टवेयर)|प्रोगार्ड (जावा ऑबफस्केटर)
 * डॉटफस्केटर|डॉटफस्केटर (.नेट ऑबफस्केटर)
 * डिजिटल अधिकार प्रबंधन
 * अविभाज्यता अस्पष्टता
 * स्रोत कोड सौंदर्यीकरण

अग्रिम पठन

 * Seyyedhamzeh, Javad, ABCME: A Novel Metamorphic Engine, 17th National Computer Conference, Sharif University of Technology, Tehran, Iran, 2012.
 * B. Barak, O. Goldreich, R. Impagliazzo, S. Rudich, A. Sahai, S. Vadhan and K. Yang. "On the (Im)possibility of Obfuscating Programs". 21st Annual International Cryptology Conference, Santa Barbara, California, USA. Springer Verlag LNCS Volume 2139, 2001.

बाहरी संबंध

 * The International Obfuscated C Code Contest
 * Protecting Java Code Via Code Obfuscation, ACM Crossroads, Spring 1998 issue
 * Can we obfuscate programs?
 * Yury Lifshits. Lecture Notes on Program Obfuscation (Spring'2005)
 * BlackBoxComputation
 * BlackBoxComputation

Ofuscación