Android ऐप साइनिंग: यह कैसे काम करता है और यह क्यों मायने रखता है
हर बार जब आप अपने Android फोन पर कोई ऐप इंस्टॉल करते हैं, तो बैकग्राउंड में एक मूक लेकिन महत्वपूर्ण सुरक्षा जांच होती है। आपका फ़ोन APK पैकेज के अंगुली का हस्ताक्षर को सत्यापित करता है। यह क्रिप्टोग्राफ़िक हैंडशेक दुर्भावनापूर्ण हैकर्स को आपके ऐप्स को मैलवेयर से "ज़हर" देने से रोकता है, जबकि यह सुनिश्चित करता है कि डेवलपर्स अपनी पहचान खोए बिना अपडेट पुश कर सकें।
यदि आप ऐप्स लिखते हैं, तो हस्ताक्षर करना एक ऐसी चीज़ है जिसे आपको बस सही करना है; यदि आप Android के साथ छेड़छाड़ करना पसंद करते हैं, तो यह समझने के लिए सिस्टम के सबसे संतोषजनक भागों में से एक है। किसी भी तरह से, ऐप साइनिंग कैसे काम करती है आपके समय के लायक है। नीचे हम प्रौद्योगिकी के बारे में जानेंगे, हस्ताक्षर योजनाएँ कैसे विकसित हुईं, और आप ऑनलाइन प्रमाणपत्रों को मैन्युअल रूप से सत्यापित करें कैसे कर सकते हैं।
- प्रत्येक Android ऐप पर हस्ताक्षर क्यों होना चाहिए और इसमें कौन सी क्रिप्टोग्राफी शामिल है (आरएसए/ईसी)।
- v1 (JAR), v2, v3 और v4 हस्ताक्षर योजनाओं के बीच अंतर, और आपके ऐप को आज किसका उपयोग करना चाहिए।
- Android कैसे निर्णय लेता है कि हस्ताक्षर निरंतरता के आधार पर अपडेट की अनुमति दी जाए या नहीं।
- कैसे कुंजी रोटेशन एक डेवलपर को मौजूदा इंस्टॉल को तोड़े बिना अपनी हस्ताक्षर कुंजी बदलने देता है।
- कमांड लाइन पर या हमारे ब्राउज़र-आधारित सत्यापनकर्ता के साथ किसी भी APK के हस्ताक्षर को स्वयं कैसे सत्यापित करें।
ऐप साइनिंग क्या है?
इसके मूल में, ऐप साइनिंग एक ऐसी प्रक्रिया है जहां एक डेवलपर अपने ऐप की फ़ाइलों के लिए एक हस्ताक्षर ब्लॉक उत्पन्न करने के लिए निजी चाबी का उपयोग करता है। इसके बाद संबंधित सार्वजनिक कुंजी को META-INF फ़ोल्डर के भीतर APK में एम्बेड किया जाता है। जब आपका फ़ोन ऐप इंस्टॉल करने का प्रयास करता है, तो यह जांचने के लिए सार्वजनिक कुंजी का उपयोग करता है कि हस्ताक्षर फ़ाइल की सामग्री से मेल खाता है या नहीं।
यह दो मुख्य गुण प्रदान करता है:
- अपरिवर्तनीयता: यदि ऐप के कोड का एक भी बाइट बदल दिया जाता है (उदाहरण के लिए, ट्रोजन द्वारा), तो हस्ताक्षर अब फ़ाइल से मेल नहीं खाएगा, और Android इसे इंस्टॉल करने से इंकार कर देगा।
- सबूत की पहचान: यदि कोई ऐप किसी मौजूदा को अपडेट करने का प्रयास करता है, तो उनके हस्ताक्षर मेल खाने चाहिए। यही कारण है कि आप आधिकारिक ऐप के स्थान पर छेड़छाड़ वाला फेसबुक ऐप इंस्टॉल नहीं कर सकते।
हस्ताक्षर योजनाओं का विकास
Google ने गति और सुरक्षा दोनों को बेहतर बनाने के लिए हस्ताक्षर तंत्र को लगातार उन्नत किया है:
- V1 (जार साइनिंग): APK (ज़िप) के भीतर अलग-अलग फाइलों पर हस्ताक्षर करता है। यह धीमा है क्योंकि OS को प्रत्येक फ़ाइल को अनज़िप करना और जांचना पड़ता है। यह कुछ ज़िप हेरफेरों के प्रति भी असुरक्षित है।
- V2 (APK हस्ताक्षर योजना): APK के संपूर्ण बाइनरी ब्लॉक पर हस्ताक्षर करता है। इसे सत्यापित करने के लिए अनजिपिंग की आवश्यकता नहीं है, जिससे यह अविश्वसनीय रूप से तेज़ हो जाता है। इसे Android 7.0 (नूगट) में पेश किया गया था।
- V3 (कुंजी रोटेशन): कुंजियों की "वंशावली" जोड़कर V2 का विस्तार करता है। यह डेवलपर को यह साबित करने की अनुमति देता है कि एक नई कुंजी पुरानी कुंजी की अधिकृत उत्तराधिकारी है। Android 9.0 (पाई) में पेश किया गया।
- V4 (स्ट्रीमिंग साइनिंग): विशेष रूप से वृद्धिशील इंस्टॉलेशन के लिए डिज़ाइन किया गया है, जो ऐप्स को यूएसबी या वाई-फाई पर डाउनलोड होने के दौरान सत्यापित करने की अनुमति देता है।
साइडलोडिंग के लिए प्रमाणपत्र क्यों मायने रखते हैं?
जब आप किसी अनौपचारिक स्रोत से APK डाउनलोड करते हैं, तो प्रमाणपत्र हैशिंग आपका सबसे अच्छा दोस्त होता है। एक प्रमाणपत्र फ़िंगरप्रिंट (जैसे SHA-256 हैश) विशिष्ट रूप से डेवलपर की हस्ताक्षर कुंजी की पहचान करता है। प्रत्येक ऐप अपने सभी अपडेट में एक ही साइनिंग कुंजी रखता है, इसलिए आप APK के फिंगरप्रिंट की तुलना डेवलपर के प्रकाशित मूल्य से कर सकते हैं ताकि यह पुष्टि हो सके कि यह वास्तविक है।
यदि आपको संदेह है कि कोई APK नकली है, तो आपको इसे हमारे ऑनलाइन APK सत्यापनकर्ता के माध्यम से चलाना चाहिए। हमारा टूल आपको दिखाएगा:
- हस्ताक्षरकर्ता का सामान्य नाम (सीएन) (उदाहरण के लिए, "Android")।
- प्रमाणपत्र का वैधता अवधि.
- SHA-1/SHA-256 फ़िंगरप्रिंट.
Android इंस्टाल समय पर किसी हस्ताक्षर को कैसे सत्यापित करता है
"प्रमाणपत्र सत्यापित करें" चरण को अक्सर इतना नजरअंदाज कर दिया जाता है कि जब आप किसी APK पर टैप करते हैं और Android यह तय करता है कि इसे इंस्टॉल करना है या नहीं, तो ओएस वास्तव में क्या करता है, इस पर गौर करना उचित है:
- APK को ज़िप के रूप में खोलें और साइनिंग ब्लॉक का पता लगाएं। v2/v3 हस्ताक्षरों के लिए जो केंद्रीय निर्देशिका के ठीक पहले एक संरचित ब्लॉक है; लीगेसी v1 योजना के लिए यह META-INF/*.RSA, *.DSA, या *.EC की सामग्री है।
- APK के हर दूसरे बाइट के SHA-256 डाइजेस्ट की गणना करें। हस्ताक्षर ब्लॉक को उसके स्वयं के डाइजेस्ट से बाहर रखा गया है; बाकी सब कुछ परिभाषित टुकड़ों में हैश किया गया है।
- हस्ताक्षर ब्लॉक में दर्ज किए गए डाइजेस्ट के विरुद्ध प्रत्येक टुकड़े के डाइजेस्ट को सत्यापित करें। यदि डेवलपर द्वारा फ़ाइल पर हस्ताक्षर करने के बाद एक भी बाइट बदल दिया गया है, तो डाइजेस्ट मेल नहीं खाएगा और इंस्टॉल को सामान्य "ऐप इंस्टॉल नहीं किया गया" त्रुटि के साथ अस्वीकार कर दिया जाएगा।
- सत्यापित करें कि हस्ताक्षर ब्लॉक स्वयं प्रमाणपत्र की निजी कुंजी के साथ निर्मित किया गया था। प्रमाणपत्र की सार्वजनिक कुंजी का उपयोग ब्लॉक में क्रिप्टोग्राफ़िक हस्ताक्षर की जांच करने के लिए किया जाता है। एक सफल जांच का मतलब है कि जिसने भी फ़ाइल पर हस्ताक्षर किए हैं उसके पास इस प्रमाणपत्र के साथ जोड़ी गई निजी कुंजी है।
- प्रमाणपत्र फ़िंगरप्रिंट की तुलना समान पैकेज नाम के किसी भी मौजूदा इंस्टॉल से करें। यदि पैकेज पहले से इंस्टॉल है और नया APK एक अलग प्रमाणपत्र के साथ हस्ताक्षरित है, तो इंस्टॉल को INSTALL_FAILED_UPDATE_INCOMPATIBLE के साथ अस्वीकार कर दिया गया है। यह ओएस का मुख्य प्रतिरूपण-विरोधी बचाव है: एक दुर्भावनापूर्ण अभिनेता आपके बैंक ऐप को अपनी कॉपी से तब तक नहीं बदल सकता जब तक कि उन्होंने बैंक की हस्ताक्षर कुंजी भी नहीं चुरा ली हो।
इनमें से कोई भी यह साबित नहीं करता है कि डेवलपर भरोसेमंद है, केवल यह कि जिस फ़ाइल को आप इंस्टॉल करने जा रहे हैं वह उनके द्वारा हस्ताक्षरित बाइट-समान है और किसी अन्य पक्ष ने इसके साथ छेड़छाड़ नहीं की है। डेवलपर पर भरोसा करना एक अलग निर्णय है, और यह निर्णय आप यह तय करके करते हैं कि आप किन स्रोतों से इंस्टॉल करते हैं।
"हस्ताक्षर बेमेल" का वास्तव में क्या मतलब है
साइडलोडिंग के दौरान लोगों को सबसे आम आश्चर्य अपडेट पर "हस्ताक्षर बेमेल" त्रुटि से होता है। यहाँ वास्तव में क्या हो रहा है:
- आपने प्ले स्टोर से ऐप एक्स संस्करण 1.0 इंस्टॉल कर लिया है।
- आप ऐप एक्स संस्करण 1.1 को गैर-प्ले स्रोत से डाउनलोड करते हैं।
- ओएस एक ही पैकेज नाम (com.example.app) देखता है लेकिन APK एक अलग प्रमाणपत्र (साइड-स्रोत की हस्ताक्षर कुंजी, मूल प्रकाशक की नहीं) के साथ हस्ताक्षरित है। यह स्थापित करने से इंकार कर देता है।
व्यवहार में ऐसा दो तरीकों से होता है:
- तृतीय-पक्ष APK वास्तव में एक अलग प्रकाशक से है, उदाहरण के लिए एक "मॉडिड" या "पैच्ड" कॉपी। इंस्टॉल से इनकार करना सही व्यवहार है; इसे इंस्टॉल करने का मतलब किसी अजनबी पर उसी डेटा के साथ भरोसा करना होगा जिसे आपके बैंक का ऐप पहले ही छू चुका है।
- तृतीय-पक्ष APK आधिकारिक APK का पुनः अपलोड है, लेकिन Google का Play ऐप साइनिंग सिस्टम प्रत्येक उपयोगकर्ता के डाउनलोड को उपयोगकर्ता के कुंजी अपलोड करें रैपर के साथ चिह्नित करता है। दो डिवाइस कभी-कभी एक ही वैचारिक ऐप संस्करण के लिए थोड़ा अलग हस्ताक्षर डेटा देख सकते हैं। उस स्थिति में रूट पर प्रमाणपत्र फ़िंगरप्रिंट अभी भी मेल खाता है; आप हमारे APK सत्यापनकर्ता से सत्यापित कर सकते हैं।
यदि प्रमाणपत्र फ़िंगरप्रिंट सही मायने में आपके मौजूदा इंस्टॉल से भिन्न है, तो आगे बढ़ने का एकमात्र तरीका प्रतिस्थापन को साइडलोड करने से पहले वर्तमान प्रतिलिपि को अनइंस्टॉल करना है (उसका डेटा खोना), हस्ताक्षर सत्यापन को कभी भी अक्षम न करें।
अपनी स्वयं की हस्ताक्षर कुंजी बनाना (डेवलपर्स के लिए)
यदि आप Android ऐप्स बना रहे हैं, तो आपको अंततः अपने स्वयं के बिल्ड पर हस्ताक्षर करने की आवश्यकता होगी। जावा SDK से keytool का उपयोग करने वाला मानक एक-पंक्ति कमांड है:
keytool -genkeypair -v \
-keystore my-release.keystore \
-alias my-app -keyalg RSA -keysize 2048 \
-validity 10000
जानने योग्य दो बातें:
- वैधता मायने रखता है: 10000 दिन (लगभग 27 वर्ष) पारंपरिक मूल्य है क्योंकि ओएस लगभग समाप्त हो चुकी या समाप्त कुंजी के साथ हस्ताक्षरित अपडेट को समझौता के रूप में मानता है। एक बार लंबे समय तक चलने वाली कुंजी बनाएं और उसकी सुरक्षा करें।
- एक बार प्रकाशित होने के बाद, आप आसानी से कुंजियाँ स्विच नहीं कर सकते। V3 हस्ताक्षर योजना एक स्पष्ट सुविधा के रूप में कुंजी ROTATION जोड़ती है: एक पुराना प्रमाणपत्र संग्रहीत प्रमाण के माध्यम से एक नए को "आशीर्वाद" देता है, जिससे पहचान निरंतरता को संरक्षित करते हुए ओएस को नई कुंजी से अपडेट स्वीकार करने की अनुमति मिलती है। V3 के बिना, मूल कुंजी खोने का अर्थ है सभी मौजूदा इंस्टॉल को अनाथ करना।
साइडलोडेड टेस्ट बिल्ड के लिए, एक अहस्ताक्षरित डिबग कीस्टोर ठीक है; उत्पादन के लिए, ऑफ़लाइन बैकअप में संग्रहीत पासवर्ड-संरक्षित लंबी-वैधता कीस्टोर का उपयोग करें।
एक पेशेवर की तरह ऐप की पहचान सत्यापित करें
सामान्य फ़ाइल नामों पर भरोसा न करें. सेकंडों में अपने APK के क्रिप्टोग्राफ़िक हृदय की जाँच करें।
अभी प्रमाणपत्र सत्यापित करेंआम हस्ताक्षर संबंधी कठिनाइयाँ
- स्व-हस्ताक्षरित प्रमाण पत्र: अधिकांश Android ऐप्स स्व-हस्ताक्षरित हैं। वेबसाइटों के लिए एसएसएल के विपरीत, Android ऐप साइनिंग के लिए कोई केंद्रीय प्राधिकरण नहीं है। आपको सीधे डेवलपर पर भरोसा करना चाहिए।
- परीक्षण के लिए बनाए गए डिबग प्रमाणपत्र: ऐप्स एक सामान्य "डीबग" कुंजी का उपयोग करते हैं। इन ऐप्स को कभी भी जनता के लिए जारी नहीं किया जाना चाहिए और ये कई सुरक्षा फ़िल्टर द्वारा अवरुद्ध हैं।
- मुख्य हानि: यदि कोई डेवलपर अपना निजी कीस्टोर खो देता है, तो वे कभी नहीं अपने ऐप को फिर से अपडेट कर सकते हैं। उन्हें एक अलग पैकेज नाम के साथ एक "नया" ऐप जारी करना होगा।
अपने लक्ष्य SDK के लिए सही हस्ताक्षर योजना का चयन करना
ऐप साइनिंग चुपचाप Android की बहुत सारी सुरक्षा को रेखांकित करती है। एक बार निजी/सार्वजनिक कुंजी संबंध पर क्लिक करने के बाद, आप किसी साइडलोड किए गए ऐप को उसकी खूबियों के आधार पर आंक सकते हैं और पुष्टि कर सकते हैं कि आप जो इंस्टॉल कर रहे हैं, उसमें डेवलपर द्वारा हस्ताक्षर किए जाने के बाद से कोई बदलाव नहीं किया गया है। Android इंटरनल के बारे में अधिक जानकारी के लिए हमारा XAPK प्रारूप के लिए मार्गदर्शिका देखें।