कोड साइनिंग

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

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

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

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

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

नमूना ईवी कोड हस्ताक्षर प्रमाणपत्र
यह सॉफ्टवेयर पर हस्ताक्षर करने के लिए SSL.com द्वारा उपयोग किए जाने वाले डिकोडेड ईवी कोड हस्ताक्षर प्रमाणपत्र का एक उदाहरण है।  इसे जारीकर्ता के सामान्य नाम के रूप में दिखाया गया है, जो इसे ईवी कोड हस्ताक्षर प्रमाणपत्र के रूप में पहचानता है। प्रमाणपत्र का   फ़ील्ड एसएसएल कॉर्प को एक संगठन के रूप में वर्णित करता है।   एकमात्र X509v3 विस्तारित कुंजी उपयोग के रूप में दिखाया गया है।  प्रमाणपत्र: डेटा: संस्करण: 3 (0x2) क्रम संख्या: 59:4e:2d:88:5a:2c:b0:1a:5e:d6:4c:7b:df:35:59:7d हस्ताक्षर एल्गोरिथ्म: sha256WithRSAएन्क्रिप्शन जारीकर्ता: सामान्य नाम = SSL.com EV कोड साइनिंग इंटरमीडिएट CA RSA R3           संगठन का नाम = एसएसएल कॉर्प इलाके का नाम = ह्यूस्टन stateOrProvinceName = टेक्सास देश का नाम = यूएस वैधता इससे पहले नहीं: अगस्त 30 20:29:13 2019 GMT इसके बाद नहीं: 12 नवंबर 20:29:13 2022 GMT विषय: 1.3.6.1.4.1.311.60.2.1.3 = यूएस 1.3.6.1.4.1.311.60.2.1.2 = नेवादा सड़क का पता = 3100 रिचमंड एवेन्यू स्टी 503 व्यवसायश्रेणी = निजी संगठन पोस्टलकोड = 77098 सामान्य नाम = एसएसएल कॉर्प क्रम संख्या = एनवी20081614243 संगठन का नाम = एसएसएल कॉर्प इलाके का नाम = ह्यूस्टन stateOrProvinceName = टेक्सास देश का नाम = यूएस विषय सार्वजनिक कुंजी जानकारी: सार्वजनिक कुंजी एल्गोरिथम: rsaएन्क्रिप्शन सार्वजनिक कुंजी: (2048 बिट) मापांक: 00:c3:e9:ae:be:d7:a2:6f:2f:24... प्रतिपादक: 65537 (0x10001) X509v3 एक्सटेंशन: X509v3 प्राधिकरण कुंजी पहचानकर्ता: keyid:36:BD:49:FF:31:2C:EB:AF:6A:40:FE:99:C0:16:ED:BA:FC:48:DD:5F प्राधिकरण सूचना पहुंच: सीए जारीकर्ता - यूआरआई:http://www.ssl.com/repository/SSLcom-SubCA-EV-CodeSigning-RSA-4096-R3.crt ओसीएसपी - यूआरआई:http://ocsps.ssl.com X509v3 प्रमाणपत्र नीतियाँ: नीति: 2.23.140.1.3 नीति: 1.2.616.1.113527.2.5.1.7 नीति: 1.3.6.1.4.1.38064.1.3.3.2 सीपीएस: https://www.ssl.com/repository X509v3 विस्तारित कुंजी उपयोग: कोड पर हस्ताक्षर X509v3 CRL वितरण बिंदु: पूरा नाम: यूआरआई:http://crls.ssl.com/SSLcom-SubCA-EV-CodeSigning-RSA-4096-R3.crl X509v3 विषय कुंजी पहचानकर्ता: EC:6A:64:06:26:A7:7A:69:E8:CC:06:D5:6F:FA:E1:C2:9A:29:79:DE X509v3 कुंजी उपयोग: महत्वपूर्ण अंगुली का हस्ताक्षर हस्ताक्षर एल्गोरिथ्म: sha256WithRSAएन्क्रिप्शन 17:d7:a1:26:58:31:14:2बी:9एफ:3बी... 

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

समय-स्टैम्पिंग
टाइम-स्टैम्पिंग को विश्वास चेतावनी से बचने के लिए डिज़ाइन किया गया था जो कि समाप्त प्रमाणपत्र के मामले में दिखाई देगी। वास्तव में, टाइम-स्टैम्पिंग किसी प्रमाणपत्र की वैधता अवधि से परे कोड ट्रस्ट को बढ़ाती है। ऐसी स्थिति में जब किसी समझौते के कारण प्रमाणपत्र को रद्द करना पड़ता है, तो समझौते की घटना की एक विशिष्ट तिथि और समय रद्दीकरण रिकॉर्ड का हिस्सा बन जाएगा। इस मामले में, टाइम-स्टैम्पिंग यह स्थापित करने में मदद करती है कि कोड पर हस्ताक्षर प्रमाणपत्र से समझौता होने से पहले या बाद में किया गया था।

Xcode में कोड साइनिंग
डेवलपर्स को किसी भी वास्तविक डिवाइस पर चलाने से पहले और ऐप स्टोर (आईओएस) पर अपलोड करने से पहले अपने आईओएस और टीवीओएस ऐप पर हस्ताक्षर करने की आवश्यकता होती है। यह साबित करने के लिए आवश्यक है कि डेवलपर के पास वैध Apple डेवलपर आईडी है। किसी एप्लिकेशन को एक वैध प्रोफ़ाइल या प्रमाणपत्र की आवश्यकता होती है ताकि वह डिवाइस पर चल सके।

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

कार्यान्वयन
Microsoft परीक्षण किए गए ड्राइवरों के लिए प्रदान किए गए कोड हस्ताक्षर का एक रूप (ऑथेंटिकोड पर आधारित) लागू करता है। चूंकि ड्राइवर कर्नेल में चलते हैं, वे सिस्टम को अस्थिर कर सकते हैं या सिस्टम में सुरक्षा छेद खोल सकते हैं। इस कारण से, Microsoft अपने WHQL परीक्षण के लिए सबमिट किए गए ड्राइवरों का परीक्षण करता है। ड्राइवर के गुजर जाने के बाद, Microsoft ड्राइवर के उस संस्करण को सुरक्षित मानता है। केवल 32-बिट सिस्टम पर, माइक्रोसॉफ्ट के साथ मान्य नहीं किए गए ड्राइवरों को इंस्टॉल करना उपयोगकर्ता को चेतावनी देते हुए इंस्टॉलेशन की अनुमति देने के बाद संभव है कि कोड अहस्ताक्षरित है। .NET (प्रबंधित) कोड के लिए, मजबूत कुंजी नामक एक अतिरिक्त तंत्र है जो प्रमाणपत्रों के विपरीत सार्वजनिक/निजी कुंजी और SHA-1-1 हैश का उपयोग करता है। हालाँकि, Microsoft ऑथेंटिकोड के प्रतिस्थापन के रूप में स्ट्रॉन्ग नेम साइनिंग पर निर्भरता को हतोत्साहित करता है।

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

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

हालाँकि, चूँकि निष्पादन योग्य हस्ताक्षरित है, केवल ध्वज का मान बदलना संभव नहीं है क्योंकि यह निष्पादन योग्य के हस्ताक्षर को बदल देता है, जिससे जाँच करने पर सत्यापन विफल हो जाता है।

यह भी देखें

 * अंगुली का हस्ताक्षर
 * आईओएस जेलब्रेकिंग
 * प्लेस्टेशन पोर्टेबल होमब्रू
 * विशेषाधिकार वृद्धि
 * रूटिंग (एंड्रॉइड ओएस)
 * सिम्बियन ओएस#प्लेटफ़ॉर्म सुरक्षा को दरकिनार करना

बाहरी संबंध

 * Apple Code Signing Guide
 * Microsoft Introduction to Code Signing
 * Debian Security Infrastructure
 * Strong Distribution HOWTO