स्रोत नियंत्रण से बाहर एपीआई कुंजी जैसे गुप्त जानकारी रखने की रणनीति?


216

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

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

जैसा कि मैं एक सस्ता कमीने हूं, मैं क्लाउड या गीथहब में मुफ्त स्रोत नियंत्रण सेवाओं जैसे टीएफएस का उपयोग करना पसंद करूंगा। यह मुझे एक मामूली पहेली के साथ छोड़ देता है:

जब मेरी एपीआई कुंजी मेरे कोड में होती है, और मेरा कोड सार्वजनिक रिपॉजिटरी में उपलब्ध होता है, तो मैं अपने शरीर को कैसे अक्षुण्ण रख सकता हूं?

मैं इसे संभालने के कई तरीकों के बारे में सोच सकता हूं, लेकिन उनमें से कोई भी ऐसा नहीं है जो संतोषजनक हो।

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

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

तकनीकी विवरण: VS2012, C # 4.5, स्रोत नियंत्रण या तो TF सेवा या GitHub होने जा रहा है। वर्तमान में संवेदनशील कुंजियों को अलग .cs फ़ाइल में विभाजित करने के लिए एक आंशिक वर्ग का उपयोग करके जिसे स्रोत नियंत्रण में नहीं जोड़ा जाएगा। मुझे लगता है कि GitHub का फायदा हो सकता है क्योंकि .ignignore का उपयोग यह सुनिश्चित करने के लिए किया जा सकता है कि आंशिक वर्ग फ़ाइल को चेक नहीं किया गया है, लेकिन मैंने इसे पहले खराब कर दिया है। "ओह, कॉमन इश्यू, यह है कि आप इसे कैसे करते हैं" की उम्मीद कर रहा हूं, लेकिन मुझे "जितना चूसना हो सकता है उतना मत करो",: /


6
आप यह सुनिश्चित कर सकते हैं कि आपकी API कुंजी रखने वाली कॉन्फ़िगरेशन फ़ाइल स्रोत नियंत्रित निर्देशिका में नहीं है, जिससे इसे पहली बार में जांचना असंभव हो जाएगा।
डेविड सर्गेई

22
BitBucket.org के पास असीमित निजी रिपॉजिटरी हैं। नि: शुल्क। और gitHub रिपॉजिटरी आयातक (इतिहास रखता है)
Rob van der Veer

4
@ डैनियस मुझे अपने डेवलपर्स पर भरोसा नहीं है क्योंकि मैं उन्हें जानता हूं। परिचित। वास्तव में, मैं अपने आप से कम से कम अंतरंग हूँ ... नहीं, मैं उसे झूठ बोलने दूंगा। लेकिन मुझे पता है कि इसे स्क्रू करना कितना आसान है, और कहा स्क्रूअप के इतिहास को खंगालना कितना कठिन होगा।
विल

15
@ डाइनियस: हाँ। मैं हर एक चरित्र को अपनी टीम के कोड में देखता हूं। गंभीरता से। मेरे पास कोई विकल्प ही नहीं बचा है। मैं आंखों पर पट्टी नहीं बांध सकता। मज़बूती से नहीं, कम से कम। लेकिन मैं करता हूं, क्योंकि मैं अपनी टीम हूं। मैं टीम में हूँ। एक डेवलपर है, और यह मैं हूँ। मैं वह हूं। हाँ। अगर वह इसे सही नहीं करता है तो मैं वह लड़का हूं जो इसे खराब करने जा रहा हूं। मेरे।
विल

3
आप कोड को पहले स्थान पर संकलित करने का प्रयास क्यों कर रहे हैं? कॉन्फ़िगरेशन फ़ाइल में उस तरह की चीज़ रखना सामान्य है।
डोनाल्ड फेलो

जवाबों:


127

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

यह कैसे करें, इसके लिए प्रश्न नियंत्रण संस्करण और व्यक्तिगत कॉन्फ़िगरेशन फ़ाइल भी देखें ।


8
@RobertHarvey को केवल संस्करण नियंत्रण पर न रखकर, जब आवश्यक हो, एक अनदेखा नियम जोड़ते हैं। सॉफ्टवेयर का उपयोग करने वाले किसी को भी अपनी स्वयं की एपीआई कुंजी के साथ अपनी कॉन्फ़िगरेशन फ़ाइल का निर्माण करना होगा।
फिलिप

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

4
खैर, फैक्ट्री डिफॉल्ट्स एक हिस्सा हैं, "इंस्टॉलर" या "फर्स्ट रन विजार्ड्स" एक और एक
जोहान्स

6
यदि कई उपयोगकर्ताओं की अपनी स्थापना है, तो क्या उन्हें अपनी API कुंजी का निर्माण और उपयोग नहीं करना चाहिए? एक ही कुंजी का उपयोग करते हुए कई साइटें / इंस्टॉल शायद एक बुरा विचार है। यदि यह सिर्फ एक इंस्टॉल है, तो कॉन्फ़िगरेशन फ़ाइल का उपयोग करना एक बड़ी परेशानी नहीं है।
माइक वेलर

10
@Will, यदि आप कार्यान्वयन विवरण की अव्यवहारिकता के कारण ऐसा नहीं कर सकते हैं, तो मैं कहूंगा कि आपके पास तैनाती के लिए उचित टूलिंग नहीं है। एक गैर-कॉमिटेड गुप्त कॉन्फिग फ़ाइल का उपयोग करते हुए तैनाती पूरी तरह से दर्द रहित होनी चाहिए। रूबी इकोसिस्टम में रहने के बाद से मैं आपको कोई विशेष सलाह नहीं दे सकता, न कि C #। लेकिन रूबी लोग स्वचालित deploys के लिए Capistrano का उपयोग करते हैं। मुझे यकीन है कि C # में स्वचालित तैनाती के लिए भी इसका उपकरण है, और इस प्रक्रिया को आसान बनाना चाहिए।
बेन ली

29

आप सिस्टम वातावरण चर के रूप में सभी निजी / संरक्षित कुंजी रख सकते हैं। आपकी कॉन्फ़िगरेशन फ़ाइल इस तरह दिखाई देगी:

private.key=#{systemEnvironment['PRIVATE_KEY']}

यह है कि हम उन मामलों को कैसे संभालते हैं और कुछ भी कोड में नहीं जाता है। यह विभिन्न संपत्ति फ़ाइलों और प्रोफाइल के साथ बहुत अच्छी तरह से काम करता है। हम विभिन्न वातावरणों के लिए अलग-अलग प्रॉपर्टी फ़ाइलों का उपयोग करते हैं। हमारे स्थानीय विकास परिवेश में हमने स्थानीय सेटअप को सरल बनाने के लिए संपत्ति की फ़ाइलों में विकास कुंजियाँ रखी हैं:

private.key=A_DEVELOPMENT_LONG_KEY

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

लाइव वातावरण में शिपिंग से पहले अपने बिल्ड सर्वर में उन पर्यावरण चर को कैसे रखा जाए? इस तरह आप उत्पादन संसाधन / विन्यास फाइल के लिए तैयार होंगे।
आयोनिस टिज़िकस

बिल्ड सर्वर विकास मशीन है, यही कारण है कि मैं इस जानकारी के बारे में चिंतित हूं कि संभवतः स्रोत नियंत्रण में गलती से जाँच हो रही है।
विल

इसके साथ समस्या यह हो सकती है कि सर्वर पर किसी के द्वारा पर्यावरण पढ़ने योग्य है।
जेसन

एक उपयोगकर्ता के दूत केवल उपयोगकर्ता या रूट द्वारा पठनीय होते हैं। (प्राचीन लिनक्स और AIX ने हालांकि ऐसा नहीं किया)
नील मैकग्विन

27

शुद्ध गिट रास्ता

  • .gitignore निजी डेटा के साथ फ़ाइल शामिल है
  • एक स्थानीय शाखा का उपयोग करें, जिसमें आप प्रतिस्थापित TEMPLATEकरते हैंDATA
  • स्मज / क्लीन फिल्टर का उपयोग करें, जिसमें (स्थानीय) फिल्टर की स्क्रिप्ट द्विदिश प्रतिस्थापन TEMPLATE<-> का प्रदर्शन करती हैDATA

विलक्षण तरीका

  • डमी कोड है, जो की जगह के शीर्ष पर MQ-पैच (ते) TEMPLATEके साथ DATA(changesets सार्वजनिक कर रहे हैं, पैच निजी है)
  • विशेष रूप से डिज़ाइन किए गए कीवर्ड के साथ कीवर्ड एक्सटेंशन (केवल आपके वर्किंग डायरेक्टरी में विस्तारित )

एससीएम-अज्ञेयवादी तरीका

  • बिल्ड / परिनियोजन प्रक्रिया के भाग के रूप में कीवर्ड का प्रतिस्थापन करें

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

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

11
@ शबनम - आरटीएफएम! रेपो में संग्रहीत फ़ाइल को अनदेखा नहीं किया गया
Lazy Badger

9
@LazyBadger - मुझे अच्छी तरह पता है कि इसे अनदेखा किया गया है। मुझे यह भी पता है कि, रेपो में होने के नाते, वहाँ हमेशा ऐसा मौका होता है कि कोई व्यक्ति कभी-कभी गलत तरीके से इसे किसी तरह रेपो में जोड़ देगा। कुछ बाहरी विन्यास पथ बेहतर है।
शबूनक

4
@shabunc - SCM पथ से कॉन्‍फ़िगर करने पर अच्‍छी बात। यही कारण है कि, उदाहरण के लिए, Postgres आपको एक फ़ाइल में पासवर्ड डालकर पासवर्ड की जांच को बायपास करने की अनुमति देता है। लेकिन उन्हें यह आवश्यक है कि पासवर्ड फ़ाइल को ~ / .pgpass में डाला जाए - जो संभवतः ऐसा स्थान नहीं है जो स्रोत नियंत्रण में जांचने के लिए बहुत सुविधाजनक है। वे जानते हैं, स्वचालन के लिए, उन्हें आपको एक बंदूक देनी होगी, लेकिन वे आपको अपने आप को इसके साथ पैर में शूटिंग से दूर रखने के लिए कड़ी मेहनत करते हैं ..
स्टीव मिडगले

14

मैं एन्क्रिप्टेड फ़ाइल (ओं) में रहस्य डालता हूं जो मैं तब करता हूं। पास वाक्यांश तब प्रदान किया जाता है जब सिस्टम लॉन्च होता है, या इसे छोटी फ़ाइल में संग्रहीत किया जाता है जो मैं प्रतिबद्ध नहीं करता हूं। यह अच्छा है कि Emacs इन एन्क्रिप्टेड फ़ाइलों का प्रबंधन करेगा। उदाहरण के लिए, एमएसीएस इनिट फ़ाइल में शामिल हैं: (लोड "mystery.el.gpg"), जो बस काम करता है - जब मैं संपादक शुरू करता हूं तो मुझे उन दुर्लभ घटनाओं पर पासवर्ड के लिए संकेत देना। मुझे किसी को एन्क्रिप्शन तोड़ने की चिंता नहीं है।


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

7
ठीक है, कुछ अर्थों में गुप्त (इस मामले में एपीआई कुंजी) को एन्क्रिप्ट करने से केवल गुप्त डेटा को कमिट न करने की समस्या से गुजरती है ताकि पास वाक्यांश को कमिट न किया जा सके (जो अब गुप्त डेटा बन जाता है )। लेकिन निश्चित रूप से, सिस्टम लॉन्च पर इसके लिए पूछना एक अच्छा विकल्प है।
सीगी

मुझे यह समाधान पसंद है। जिस तरह की एन्क्रिप्ट की गई फाइल है, वह KeePass फाइल हो सकती है। इसमें प्रत्येक पर्यावरण के लिए एक प्रविष्टि होगी, notes.env फ़ाइल की सामग्री को संग्रहीत करने के लिए फ़ील्ड का उपयोग करके । कुछ महीने पहले मैंने एक उपकरण लिखा था, जो एक प्रविष्टि फ़ाइल को पढ़ सकता है और notesएक प्रविष्टि के क्षेत्र का उपयोग करके .env फ़ाइल बना सकता है । मैं एक सुविधा जोड़ने के बारे में सोच रहा हूं ताकि मैं require('switchenv').env()Node.js कार्यक्रम के शीर्ष पर कर सकूं और NODE_ENV से मेल खाने वाली प्रविष्टि के आधार पर प्रक्रिया ।env चर या ऐसा कुछ बना सकूं। -> github.com/christiaanwesterbeek/switchenv
क्रिस्टियान वेस्टरबेक

14

यह बहुत ही Android / Gradle विशिष्ट है लेकिन आप अपनी वैश्विक gradle.propertiesफ़ाइल में स्थित कुंजियों को परिभाषित कर सकते हैं user home/.gradle/। यह उपयोगी भी है क्योंकि आप बिल्ड प्रॉपर्टी या स्वाद के आधार पर विभिन्न गुणों का उपयोग कर सकते हैं अर्थात देव के लिए एपीआई और रिलीज के लिए अलग।

gradle.properties

MY_PRIVATE_API_KEY=12356abcefg

build.gradle

buildTypes {
        debug{
            buildConfigField("String", "GOOGLE_VERIFICATION_API_KEY", "\"" + MY_PRIVATE_API_KEY +"\"")
            minifyEnabled false
            applicationIdSuffix ".debug"
            }
        }

कोड में आप इस तरह का संदर्भ देंगे

String myAPI = BuildConfig.GOOGLE_VERIFICATION_API_KEY;

BuildConfig संबंधित स्रोत फ़ाइल में अनुवाद करता है, इसलिए आपकी एपीके पर सरल रिवर्स इंजीनियरिंग उन सभी कुंजियों और रहस्यों को प्रकट करेगी जो आप BuildConfig में डालते हैं
दिमित्री लिवोटोव

1
वास्तव में, एक वैध बिंदु। लेकिन सवाल यह था कि एपीआई कीज को सोर्स कोड से कैसे रखा जाए, बाइनरी नहीं।
स्कॉटीटैब

11

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

मोबाइल वेब अनुप्रयोग

एंड्रॉइड / आईफोन के लिए डिवाइस को ऐप को पहली बार चलाने पर अपनी स्वयं की वेब सेवा से कुंजी का अनुरोध करना चाहिए। कुंजी तब एक सुरक्षित स्थान पर संग्रहीत की जाती है। क्या प्रकाशक द्वारा कुंजी को बदला या निरस्त किया जाना चाहिए। आपकी वेब सेवा एक नई कुंजी प्रकाशित कर सकती है।

वेब अनुप्रयोग होस्ट किया गया

आपके सॉफ़्टवेयर के लाइसेंस का उपयोग करने वाले ग्राहकों को पहले सॉफ़्टवेयर को कॉन्फ़िगर करते समय कुंजी को मैन्युअल रूप से इनपुट करना होगा। आप सभी को एक ही कुंजी, अलग-अलग कुंजी दे सकते हैं या वे अपने स्वयं के प्राप्त कर सकते हैं।

प्रकाशित स्रोत कोड

आप अपने स्रोत कोड को सार्वजनिक रिपॉजिटरी में संग्रहीत करते हैं, लेकिन प्रमुख नहीं। फ़ाइल के कॉन्फ़िगरेशन में आप लाइनों * जगह कुंजी * यहाँ जोड़ते हैं । जब कोई डेवलपर आपके स्रोत कोड का उपयोग करता है तो वे sample.cfgफ़ाइल की एक प्रति बनाते हैं और अपनी कुंजी जोड़ते हैं।

आप अपनी config.cfgफ़ाइल को रिपॉजिटरी में विकास या उत्पादन के लिए उपयोग नहीं करते हैं ।


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

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

7
फिर हम कुंजी-प्रकाशन वेब सेवा की सुरक्षा कैसे करते हैं? एक और कुंजी का उपयोग?
जेजे झांग

Ditto क्या @JianggeZhang ने कहा - यह खतरनाक सलाह है
डेविड के। हेस

5

प्रत्येक सर्वर के लिए बदलने वाली गुप्त चीजों के लिए पर्यावरण चर का उपयोग करें।

http://en.wikipedia.org/wiki/Environment_variable

उनका उपयोग कैसे करना है यह भाषा पर निर्भर है।


3
अस्पष्टता के माध्यम से सुरक्षा कई लोगों के लिए अनुशंसित दृष्टिकोण नहीं है। क्या आप अधिक स्पष्ट होने के लिए अपने उत्तर पर विस्तार से ध्यान देंगे?

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

4

मुझे लगता है कि यह एक ऐसा मुद्दा है जिस पर हर किसी को कुछ न कुछ परेशानी होती है।

यहां मैंने एक वर्कफ़्लो का उपयोग किया है, जो आपके लिए काम कर सकता है। यह एक मोड़ के साथ .itignore का उपयोग करता है:

  1. सभी कॉन्फ़िगरेशन फ़ाइलें एक विशेष फ़ोल्डर में जाती हैं (w / नमूना कॉन्फ़िगरेशन फ़ाइलें - वैकल्पिक)
  2. सभी कॉन्फ़िगरेशन फ़ाइलें .gitignore में शामिल हैं, ताकि वे सार्वजनिक न हों
  3. एक निजी बॉक्स पर gitolite सर्वर (या अपने पसंदीदा git सर्वर) को सेट करें
  4. निजी सर्वर में सभी कॉन्फ़िगर फ़ाइलों के साथ एक रेपो जोड़ें
  5. मुख्य रेपो (वैकल्पिक) में विशेष फ़ोल्डर में कॉन्फ़िगर फ़ाइलों को कॉपी करने के लिए एक स्क्रिप्ट जोड़ें

अब, आप किसी भी विकास और परिनियोजन प्रणाली के लिए कॉन्फ़िगरेशन रेपो को क्लोन कर सकते हैं। फ़ाइलों को सही फ़ोल्डर में कॉपी करने के लिए स्क्रिप्ट चलाएं और आपका काम हो गया।

आप अभी भी सभी GitHub कैंडी प्राप्त करते हैं, अपने कोड को दुनिया के साथ साझा करते हैं और संवेदनशील डेटा मुख्य रेपो में कभी नहीं होते हैं, इसलिए वे सार्वजनिक नहीं होते हैं। वे अभी भी किसी भी तैनाती प्रणाली से केवल एक पुल और कॉपी हैं।

मैं निजी git सर्वर के लिए एक 15 $ / वर्ष के बॉक्स का उपयोग करता हूं, लेकिन आप घर पर, cheakkkk आवश्यकता के अनुसार सेटअप भी कर सकते हैं; ;-)

पुनश्च: आप एक गिट सबमॉड्यूल ( http://git-scm.com/docs/git-submodule ) का भी उपयोग कर सकते हैं , लेकिन मैं हमेशा कमांड भूल जाता हूं, इसलिए त्वरित और गंदे नियम!


2

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

निरंतर डिलीवरी के लिए, आप कहीं न कहीं दर्ज की गई विभिन्न कुंजियाँ चाहते हैं। कॉन्फ़िगरेशन को कोड से सीमांकित किया जाना चाहिए, लेकिन इसे संशोधन नियंत्रण में रखने के लिए बहुत समझदारी है।


1

3 रणनीतियाँ, अभी तक उल्लिखित नहीं हैं (?)

वीसीएस में चेक इन या प्री-चेक हुक में

  • उच्च एन्ट्रापी के साथ तारों की खोज, उदाहरण- गुप्त-रहस्य
  • regex प्रसिद्ध एपीआई कुंजी पैटर्न के लिए खोज। AWS की AKIA * कुंजियाँ एक उदाहरण हैं, git-secret एक उपकरण है जो उसी पर आधारित है। इसके अलावा, निरंतर काम के साथ 'पासवर्ड' जैसे चर नाम।
  • ज्ञात रहस्यों की खोज- आप अपने रहस्यों को जानते हैं, उनके लिए खोज पाठ। या एक उपकरण का उपयोग करें, मैंने अवधारणा का यह प्रमाण लिखा है ।

रणनीतियाँ पहले ही उल्लिखित हैं

  • स्रोत ट्री के बाहर फ़ाइल में संग्रहित करें
  • स्रोत पेड़ में है, लेकिन वीसीएस को इसे अनदेखा करने के लिए कहें
  • पर्यावरण चर स्रोत पेड़ के बाहर डेटा भंडारण पर एक बदलाव है
  • बस डेवलपर्स को मूल्यवान रहस्य न दें

0

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

लाभ:

  • विकास इकाई == उत्पादन इकाई नहीं मानता
  • सभी सहयोगियों / कोड समीक्षकों पर भरोसा नहीं किया जाता है
  • संस्करण नियंत्रण से बाहर रखकर आसान गलतियों को रोकें
  • क्यूए / बिल्ड के लिए कस्टम कॉन्फ़िगरेशन के साथ इंस्टॉल को स्वचालित करना आसान है

यदि आप पहले से ही ऐसा कर रहे हैं और गलती से इसे चेक कर रहे हैं, तो इसे अपने प्रोजेक्ट में जोड़ें .gitignore। यह फिर से करना असंभव बना देगा।

वहाँ मुफ्त Git होस्ट के बहुत सारे हैं जो निजी भंडार प्रदान करते हैं। यद्यपि आपको कभी भी अपनी साख का संस्करण नहीं देना चाहिए, आप सस्ते हो सकते हैं और निजी रिपोज भी हो सकते हैं। ^ _ ^


-2

OAuth कुंजी को कहीं भी कच्चे डेटा के रूप में संग्रहीत करने के बजाय, कुछ एन्क्रिप्शन एल्गोरिथ्म के माध्यम से स्ट्रिंग क्यों नहीं चलाएं, और इसे नमकीन के रूप में संग्रहीत करें। फिर रनटाइम पर इसे पुनर्स्थापित करने के लिए कॉन्फ़िगरेशन फ़ाइल का उपयोग करें। इस तरह कुंजी को कहीं भी संग्रहीत नहीं किया जाता है, चाहे वह एक विकास बॉक्स पर संग्रहीत हो, या स्वयं सर्वर।

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

संपादित करें: शायद स्टैनफोर्ड जावास्क्रिप्ट क्रिप्टो लाइब्रेरी का प्रयास करें , यह कुछ बहुत ही सुरक्षित सममित एन्क्रिप्शन / डिक्रिप्शन के लिए अनुमति देता है।


1
Hashes आम तौर पर एक तरह से हाथापाई हैं। सममित एन्क्रिप्शन एल्गोरिदम हैं जो आपको सुझाव देते हैं, हालांकि।

3
यार, तुम एक हैश unencrypt (आसानी से) नहीं कर सकते। यह हैश की पूरी बात है। यह मेरे लिए किसी और के एपीआई का उपभोग करने के लिए है, जहां वे मुझे एक गुप्त कुंजी सौंपते हैं। मेरी हैशिंग यह सुनिश्चित करती है (जब तक कि मैं एक गरीब अहंकार का चयन न करूं और हर बार इसे दरार कर दूं) कि मैं उनके एपीआई का उपयोग नहीं कर सकता।
विल
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.