(गुप्त) स्रोत कोड में एक स्ट्रिंग गुप्त रखते हुए


50

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

क्या यह संभव है कि मेरे स्रोत कोड को एक स्ट्रिंग सरणी के साथ छिपाया, एन्क्रिप्ट किया गया है, या अन्यथा अस्पष्ट रूप से प्रकाशित किया जा सकता है? शायद एक ऑनलाइन डेटाबेस से जवाब पढ़ने से?

अपडेट करें

नीचे काम किया युवल फिल्मस। जब मैंने पहली बार इसे पढ़ा तो मुझे यकीन नहीं था कि यह कैसे करना है। मुझे कुछ विकल्प मिले, दूसरे विकल्प के लिए: स्रोत में हैशेड समाधान को संग्रहीत करना और उपयोगकर्ता द्वारा अनुमान लगाने वाले हैश की गणना करना। जावास्क्रिप्ट में ऐसा करने के लिए http://code.google.com/p/crypto-js/ पर क्रिप्टो-जेएस लाइब्रेरी है । Android के लिए, MessageDigest फ़ंक्शन का उपयोग करें । एक एप्लिकेशन है (fdroid / github पर) जिसे HashPass कहा जाता है जो ऐसा करता है।


11
मुझे आश्चर्य है कि यह यहाँ कैसे ontopic है; यह किसी भी मामले में सूचना सुरक्षा के लिए बेहतर हो सकता है ।
राफेल

2
@YuvalFilmus "हॉट क्वेश्चन" वोटों से मूर्ख मत बनो। लेकिन बिंदु ने लिया।
राफेल

4
यहाँ गायब होने वाले महत्वपूर्ण विवरण हैं: क्या आप केवल उपयोगकर्ता के उत्तरों को सत्यापित करना चाहते हैं या क्या आप सही उत्तर को भी प्रिंट करने में सक्षम होना चाहते हैं? और, क्या आपको किसी फ़ज़ीने की ज़रूरत है, या क्या सही उत्तरों का एक स्पष्ट सीमित सेट है (जो कि आप इस सेट के खिलाफ उपयोगकर्ता के जवाब को एक-एक करके देख सकते हैं)?
हाइड

4
सभी उत्तर पूछ रहे हैं कि आप क्या समस्या हल करना चाहते हैं। आप उत्तर प्रकाशित क्यों नहीं कर सकते?
Rhymoid

1
इन स्ट्रिंग्स के साथ आपका कोड क्या कर सकता है? क्या उन्हें डिकोड करने में सक्षम होना चाहिए? या उन्हें तार की तुलना करने में सक्षम होने के लिए पर्याप्त है?
डेविड श्वार्ट्ज

जवाबों:


83

आपके पास कम से कम दो विकल्प हैं, इस पर निर्भर करता है कि आप किस समस्या को हल करना चाहते हैं।

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

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


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

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

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

4
क्रिस जो उल्लेख कर रहा है, उसका मुकाबला करने के लिए, आप एक हैशिंग प्रक्रिया चुन सकते हैं जो बहुत धीमी है, कहते हैं कि यह 100ms (कुछ पीके मानकों द्वारा लिया गया दृष्टिकोण) लेता है। यह अभी भी उपयोगकर्ता के दृष्टिकोण से बहुत तेज़ है, लेकिन गणना को और अधिक कठिन बना देता है।
युवल फिल्मस

12
@YuvalFilmus फिर, एक हद तक। यदि आपकी पहेली "जन, जो या जेन अपराधी थी?" तो यह बहुत आसान होने जा रहा है भले ही आप हैश पूरा मिनट ले। जब तक कि पूरे खेल को ध्यान में रखकर नहीं लिखा जाता है, और सभी प्रश्न बेहद खुले अंत के होते हैं, इससे समस्या पैदा होगी। लेकिन हाँ, अगर आपके प्रश्नों हैं ओपन एंडेड कि कि राज्य अंतरिक्ष पर्याप्त रूप से बड़े है, जवाब संरक्षित किया जा सकता।
क्रिस हेस

28

आपके पास दो तीन विकल्प हैं:

उत्तर को सोर्स कोड के बाकी हिस्सों से अलग रखें

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

उत्तर अपने सोर्स कोड में डालें

वैकल्पिक रूप से, यदि आप उन सवालों और जवाबों पर विचार करते हैं, जो आप चाहते हैं कि आप खट्टा होना चाहते हैं तो इसका मुख्य हिस्सा है, तो आपको उत्तर को स्रोत कोड में रखना चाहिए, अधिमानतः अप्रमाणित ताकि अन्य पढ़ सकें और उन्हें संशोधित कर सकें । स्रोत कोड का विरोध करना ताकि इसे समझा और संशोधित न किया जा सके, वास्तव में खुले स्रोत कोड के सिद्धांतों के अनुरूप नहीं है।

इंटरनेट पर एक सर्वर पर जवाब रखो

उपरोक्त दोनों समाधानों के साथ, किसी ऐसे व्यक्ति के लिए यह संभव है, जिसने आपके ऐप को डाउनलोड किया हो, ताकि किसी भी मामले में आपके प्रोग्राम को खेले बिना उत्तरों का पता लगाया जा सके - चाहे आप अपने उत्तरों को कैसे भी लिखें / एन्क्रिप्ट करें, यदि आपका प्रोग्राम अतिरिक्त जानकारी के बिना उत्तर की पहचान कर सकता है, तो अपने संकलित अनुप्रयोग की जांच कर सकता है।

यदि आप वास्तव में यह सुनिश्चित करना चाहते हैं कि कोई भी उत्तर का पता नहीं लगा सकता है, तो एकमात्र वास्तविक विकल्प उन्हें उत्तर देना नहीं है और एप्लिकेशन को एक वेब सेवा आदि कॉल करना है ... जब भी वे उत्तर जानना चाहते हैं। ऐप को उस उत्तर को भेजना चाहिए जो उपयोगकर्ता ने दर्ज किया है और वेब सेवा को ऐप को यह बताना चाहिए कि उत्तर सही है या नहीं, इस तरह से उपयोगकर्ता के पास यह बताने का कोई तरीका नहीं है कि उत्तर क्या है जब तक कि उनके पास पहले से ही सही उत्तर न हो (लघु वेब सेवा के लिए मजबूर करना, जिसका आप पता लगा सकते हैं और उससे बचाव कर सकते हैं)।

यदि आप अपने जवाबों को बाधित करने के तरीकों की तलाश कर रहे हैं जो मुझे सुझाव देते हैं कि आप वास्तव में अपने उत्तरों को पहली बार में खोलना नहीं चाहते हैं, तो आपको पहले विकल्पों पर विचार करना चाहिए।

यदि यह महत्वपूर्ण है कि उपयोगकर्ता पहले से उत्तर नहीं ढूंढ पा रहा है तो तीसरा विकल्प आपकी एकमात्र वास्तविक पसंद है, हालांकि मैं एक ऐसे परिदृश्य के बारे में सोच रहा हूं जहां यह प्रयास के लायक होगा, कम से कम क्योंकि यह आपके उपयोगकर्ताओं को रोकता है बिना इंटरनेट कनेक्शन के अपने ऐप का उपयोग करने से।


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

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

1
यदि लक्ष्य उत्तरों की जांच करना है और उन्हें दिखाने की आवश्यकता नहीं है, तो इसे उसी तरह से किया जा सकता है जैसे पासवर्ड एक तरह से हैश के साथ।
जेम्सरियन

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

4

यदि ऑब्जेक्ट स्रोत कोड के आकस्मिक पढ़ने से तारों को अस्पष्ट करने के लिए है, लेकिन उन्हें खुला रखें तो अन्य लोग आसानी से अपने स्वयं के परिवर्तन कर सकते हैं - उदाहरण के लिए यदि आप स्रोत को टेक्स्ट एडवेंचर में प्रकाशित कर रहे थे और कोई वर्णनात्मक पाठ नहीं चाहते थे जो एक बिगाड़ने का गठन करेगा, तो कुछ प्रतिवर्ती का उपयोग करें जैसे कि रोट 13।

वास्तव में, आप अपनी सभी अनुवाद फ़ाइलों को रॉट 13 कर सकते हैं और उन्हें वापस फ़्लिप कर सकते हैं।

वह खुली भावना रख रहा है। रैंडम "मैजिक" हैश वास्तव में प्रोग्रामर-अनुकूल नहीं है।


4
याद रखें कि हमारे बीच कई GeoCaching लोग मूल रूप में धाराप्रवाह रूप में लगभग 13 पढ़ते हैं।
यो '

4

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


1
किस अर्थ में आप गेम डेटा को "प्रकाशित नहीं" कर सकते हैं? गेम को उस डेटा को एक्सेस करने में सक्षम होना चाहिए ताकि जिस किसी के पास गेम की कॉपी है उसके पास डेटा की कॉपी हो। यह वास्तव में प्रकाशन क्या है: सार्वजनिक कर रहा है।
डेविड रिचरबी 10

1
@DavidRicherby क्या आप प्रकाशित करना चाहते हैं और अंत waht पर निर्भर करता है। वह गेम या आपका इंजन जिसका उपयोग कई समान गेम बनाने के लिए किया जा सकता है? लोगों को आपके खेल में हेरफेर करने की अनुमति दें, सुरक्षा छेद अयस्क के लिए कोड का निरीक्षण करें बस घटकों का पुन: उपयोग करें? यदि आपका इंटरफ़ेस "CSV के साथ q & a + प्रोग्राम = गेम" जितना सरल है, तो मुझे लगता है कि यह केवल प्रोग्राम को प्रकाशित करने के लिए बोधगम्य है, न कि CSV के लिए।
राफेल

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

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

4

यदि आप अपने उपयोगकर्ताओं को उन्हें जानना नहीं चाहते हैं, तो आप अपने उत्तरों को अपने GPL स्रोत कोड में क्यों संग्रहीत करेंगे? यहां तक ​​कि अगर वे अभी तक ज्ञात नहीं हैं या आसानी से क्रैक करने योग्य हैं, तो वे भविष्य में हो सकते हैं (और संभावना है)।

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

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


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

1

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

इसलिए यदि आप एक स्थानीय डेटाबेस चाहते हैं, लेकिन यह विचार नहीं है कि यह blatantly डिक्रिप्ट हो रहा है, तो आप एक ब्लूम फ़िल्टर का उपयोग कर सकते हैं (नेटवर्क से बात करने या स्थानीय रूप से एक बड़ा डिक्रिप्टेड डेटाबेस होने से बचने के लिए)। यह तब होता है जब मेमोरी स्पेस वास्तव में तंग होने पर स्पेल चेकर्स काम करते थे।

इसलिए, यदि आप फ़िल्टर में प्रश्न / उत्तर जोड़े जोड़ते हैं:

हैश (NormalizeString (प्रश्न [n])) + हैश (NormalizeString (उत्तर [n]))

यदि आप पूछते हैं कि क्या "वर्जीनिया का कैपिटल? रिचमंड" सेट में है, तो यह या तो "निश्चित रूप से नहीं", या "लगभग निश्चित रूप से हां" का जवाब देगा। यदि आपको बहुत अधिक झूठी सकारात्मकताएँ मिलती हैं, तो डेटाबेस को बड़ा करें।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.