PHP में एन्क्रिप्शन. PHP एन्क्रिप्शन और प्रमाणीकरण कुंजी में एक कुंजी का उपयोग करके डेटा को एन्क्रिप्ट, डिक्रिप्ट करें

  • अनुवाद
  • ट्यूटोरियल

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

यह PHP में सममित एन्क्रिप्शन के साथ आम नुकसान से बचने के बारे में एक त्वरित मार्गदर्शिका है।

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

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

स्वाभाविक रूप से, यहां दी गई सिफारिशें PHP में एन्क्रिप्शन को व्यवस्थित करने का "एकमात्र संभावित तरीका" नहीं हैं। इस मार्गदर्शिका का उद्देश्य गलतियों और कठिन, अस्पष्ट निर्णयों के लिए कम जगह छोड़ने का प्रयास करना है।

PHP में एन्क्रिप्शन फ़ंक्शन

मैक्रिप्ट या ओपनएसएसएल एक्सटेंशन का उपयोग करें।

एन्क्रिप्शन एल्गोरिदम और इसके संचालन का तरीका, एक बार का कोड (प्रारंभिक वेक्टर)

रैंडम वन-टाइम कोड के साथ CTR मोड में AES-256 का उपयोग करें ( लगभग। अनुवाद: गैर). एईएस एक मानक है, इसलिए आप किसी भी एक्सटेंशन - एमक्रिप्ट या ओपनएसएसएल के कार्यों का उपयोग कर सकते हैं।

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

एक बार का कोड 128 बिट्स (16 बाइट्स) लंबा होना चाहिए, बिना किसी एन्कोडिंग के बस बाइट्स की एक स्ट्रिंग।

एमक्रिप्ट एक्सटेंशन में, एईएस को रिजेंडेल-128 के नाम से जाना जाता है ( लगभग। अनुवाद: इस तथ्य के बावजूद कि हम एईएस-256 के बारे में बात कर रहे हैं, यह कोई त्रुटि नहीं है। एईएस-256 != रिजेंडेल-256). ओपनएसएसएल में, क्रमशः, एईएस-256-सीटीआर।

मैक्रिप्ट उपयोग उदाहरण:
ओपनएसएसएल उदाहरण:
सत्यापित करें कि एन्क्रिप्शन परीक्षण वैक्टर का उपयोग करके सही ढंग से काम कर रहा है ( लगभग। अनुवाद: एईएस-256-सीटीआर के लिए पृष्ठ 57 पर पैराग्राफ एफ.5.5 देखें).

सीटीआर मोड के लिए, एन्क्रिप्टेड डेटा की कुल मात्रा पर कुछ प्रतिबंध हैं। व्यवहार में आपको इसका सामना नहीं करना पड़ सकता है, लेकिन ध्यान रखें कि आपको एक कुंजी के साथ 2^64 बाइट्स से अधिक डेटा एन्क्रिप्ट नहीं करना चाहिए, चाहे वह एक लंबा संदेश हो या कई छोटे।

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

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

डेटा प्रमाणीकरण

हमेशा डेटा की प्रामाणिकता और अखंडता की जांच करें।
ऐसा करने के लिए, एन्क्रिप्शन के बाद MAC का उपयोग करें। वे। पहले डेटा को एन्क्रिप्ट किया जाता है, और फिर HMAC-SHA-256 को परिणामी सिफरटेक्स्ट से लिया जाता है, जिसमें सिफरटेक्स्ट और वन-टाइम कोड भी शामिल होता है।

डिक्रिप्ट करते समय, पहले तुलना एल्गोरिदम का उपयोग करके एचएमएसी की जांच करें जो टाइमिंग हमलों के लिए प्रतिरोधी है। == या === तुलना ऑपरेटरों का उपयोग करके सीधे $user_submitted_mac और $calculated_mac की तुलना न करें। "एचएमएसी डबल चेक" का उपयोग करना और भी बेहतर है।

यदि HMAC जाँच सफल होती है, तो डिक्रिप्शन सुरक्षित रूप से किया जा सकता है। यदि एचएमएसी उपयुक्त नहीं है, तो तुरंत बंद कर दें।

एन्क्रिप्शन और प्रमाणीकरण कुंजी

आदर्श रूप से, यादृच्छिकता के क्रिप्टोग्राफ़िक रूप से मजबूत स्रोत से प्राप्त कुंजियों का उपयोग करें। AES-256 को 32 बाइट्स यादृच्छिक डेटा (एक "कच्ची" स्ट्रिंग - बिना किसी एन्कोडिंग का उपयोग किए बिट्स का एक अनुक्रम) की आवश्यकता होती है।

यदि एप्लिकेशन 5.5 से नीचे PHP संस्करण के तहत चल रहा है, जिसमें PBKDF2 का अंतर्निहित कार्यान्वयन नहीं है, तो आपको PHP में अपने स्वयं के कार्यान्वयन का उपयोग करना होगा, जिसका एक उदाहरण यहां पाया जा सकता है: https://defuse। ca/php-pbkdf2.htm. सावधान रहें कि आपके स्वयं के कार्यान्वयन पर निर्भर रहने से कुंजी ठीक से हल नहीं हो सकती है जैसा कि अंतर्निहित hash_pbkdf2() फ़ंक्शन करता है।

एन्क्रिप्शन और प्रमाणीकरण के लिए एक ही कुंजी का उपयोग न करें। जैसा कि ऊपर बताया गया है, एन्क्रिप्शन कुंजी के लिए 32 बाइट्स और प्रमाणीकरण कुंजी (HMAC) के लिए 32 बाइट्स की आवश्यकता होती है। PBKDF2 के साथ आप पासवर्ड से 64 बाइट्स ले सकते हैं और पहले 32 बाइट्स को एन्क्रिप्शन कुंजी के रूप में और शेष 32 बाइट्स को प्रमाणीकरण कुंजी के रूप में उपयोग कर सकते हैं।

यदि आपके पासवर्ड किसी फ़ाइल में संग्रहीत हैं, उदाहरण के लिए, HEX स्ट्रिंग के रूप में, तो उन्हें एन्क्रिप्शन फ़ंक्शंस में फीड करने से पहले उन्हें दोबारा एनकोड न करें। इसके बजाय, HEX-एन्कोडेड कुंजियों को सीधे उच्च-गुणवत्ता एन्क्रिप्शन या प्रमाणीकरण कुंजी में परिवर्तित करने के लिए PBKDF2 का उपयोग करें। या हैश पासवर्ड के लिए बिना किसी अतिरिक्त एन्कोडिंग आउटपुट (केवल 32 बाइट स्ट्रिंग) के साथ SHA-256 का उपयोग करें। नियमित पासवर्ड हैशिंग का उपयोग पर्याप्त एन्ट्रापी प्रदान करता है। अधिक विवरण निम्नलिखित पैराग्राफ में दिए गए हैं।

कुंजी खिंचाव

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

PBKDF2 के मापदंडों में से एक हैशिंग पुनरावृत्तियों की संख्या है। और यह जितना अधिक होगा, कुंजी की सुरक्षा उतनी ही अधिक होगी जिस पर आप भरोसा कर सकते हैं। यदि आपका कोड 64-बिट प्लेटफ़ॉर्म पर चल रहा है, तो PBKDF2 के लिए हैशिंग एल्गोरिदम के रूप में SHA-512 का उपयोग करें। 32-बिट प्लेटफ़ॉर्म के लिए, SHA-256 का उपयोग करें।

हालाँकि, DoS हमले के जोखिम के कारण ऑनलाइन अनुप्रयोगों में अपेक्षाकृत अधिक संख्या में पुनरावृत्तियों का उपयोग करना संभव नहीं है। इसलिए, मुख्य गुणवत्ता ऑफ़लाइन अनुप्रयोगों जितनी उच्च नहीं होगी, जो इस तरह के जोखिम के बिना बड़ी संख्या में पुनरावृत्तियों को वहन कर सकती है। एक नियम के रूप में, ऑनलाइन अनुप्रयोगों के लिए, इतनी संख्या में हैशिंग पुनरावृत्तियों का चयन किया जाता है ताकि PBKDF2 100 एमएस से अधिक न ले।

यदि आप उच्च एन्ट्रॉपी पासवर्ड का उपयोग कर सकते हैं, तो इसे बढ़ाना आवश्यक नहीं है जैसा कि आप कम एन्ट्रॉपी पासवर्ड के लिए करेंगे। उदाहरण के लिए, यदि आप /dev/urandom का उपयोग करके एक "एन्क्रिप्शन_मास्टर_की" और एक "ऑथ_मास्टर_की" बनाते हैं, तो PBKDF2 की बिल्कुल भी आवश्यकता नहीं है। बस बिना किसी एन्कोडिंग के, बिट्स के अनुक्रम के रूप में कुंजियों का उपयोग करना सुनिश्चित करें।

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

कुंजी भंडारण और प्रबंधन

सबसे अच्छी बात एक अलग समर्पित कुंजी भंडारण उपकरण (एचएसएम) का उपयोग करना है।

यदि यह संभव नहीं है, तो हमले को जटिल बनाने के लिए, कोई एक अलग स्थान (होम निर्देशिका या साइट रूट के बाहर) में संग्रहीत कुंजी का उपयोग करके कुंजी फ़ाइल या कॉन्फ़िगरेशन फ़ाइल (जो वास्तविक एन्क्रिप्शन/प्रमाणीकरण कुंजी संग्रहीत करता है) के एन्क्रिप्शन का उपयोग कर सकता है। . उदाहरण के लिए, आप वास्तविक कुंजी फ़ाइल को डिक्रिप्ट करने के लिए आवश्यक कुंजी को संग्रहीत करने के लिए httpd.conf में अपाचे पर्यावरण चर का उपयोग कर सकते हैं:
SetEnv keyfile_key क्रिप्टो_strong_high_entropy_key # आप $_SERVER["keyfile_key"] का उपयोग करके PHP में इस वेरिएबल तक पहुंच सकते हैं # बाकी कॉन्फ़िगरेशन
अब, यदि साइट के मूल में और नीचे की फ़ाइलों, जिनमें कुंजियों वाली फ़ाइलें भी शामिल हैं, से छेड़छाड़ की जाती है (उदाहरण के लिए, यदि कोई बैकअप लीक हो गया है), तो एन्क्रिप्टेड डेटा सुरक्षित रहेगा क्योंकि पर्यावरण चर में संग्रहीत कुंजी से समझौता नहीं किया गया है। यह याद रखना महत्वपूर्ण है कि httpd.conf फ़ाइलों का बैकअप अलग से लिया जाना चाहिए, और उदाहरण के लिए, phpinfo() के आउटपुट के माध्यम से keyfile_key वेरिएबल से समझौता नहीं करना चाहिए।

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

आधार - सामग्री संकोचन

सामान्य तौर पर, आपको स्रोत पाठ को एन्क्रिप्ट करने से पहले उसे संपीड़ित नहीं करना चाहिए। इससे दुश्मन को विश्लेषण के लिए एक अतिरिक्त उपकरण मिल सकता है।

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

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

यदि आपको डेटा को संपीड़ित करने की कोई सख्त आवश्यकता नहीं है, तो इसे संपीड़ित न करें।

सर्वर वातावरण

एक सामान्य नियम के रूप में, आपको किसी साझा सर्वर पर सुरक्षा-संवेदनशील एप्लिकेशन होस्ट नहीं करना चाहिए। उदाहरण के लिए, साझा होस्टिंग पर, जहां एक प्रतिद्वंद्वी आपके जैसे ही भौतिक सर्वर पर वर्चुअल मशीन तक पहुंच सकता है।

ऐसे कई कारण हैं जो साझा सर्वर को सुरक्षा-महत्वपूर्ण अनुप्रयोगों को होस्ट करने के लिए एक संदिग्ध स्थान बनाते हैं। उदाहरण के लिए, वर्चुअल सर्वर के बीच हमलों का हाल ही में प्रदर्शन किया गया है: eprint.iacr.org/2014/248.pdf। यह एक अच्छा अनुस्मारक है कि आक्रामक तकनीकें खराब नहीं होती हैं, बल्कि समय के साथ उनमें सुधार और सुधार किया जाता है। ऐसे नुकसानों को हमेशा ध्यान में रखना चाहिए।

विशेषज्ञ परामर्श

अंतिम लेकिन महत्वपूर्ण बात, अपने सुरक्षा कोड की समीक्षा के लिए किसी विशेषज्ञ से परामर्श लें।

(पीएचपी 4, पीएचपी 5, पीएचपी 7)

क्रिप्ट - वन-वे स्ट्रिंग हैशिंग

चेतावनी

यह फ़ंक्शन (अभी तक) बाइनरी सुरक्षित नहीं है!

विवरण

क्रिप्ट (स्ट्रिंग $str [, स्ट्रिंग $नमक]): डोरी

तहख़ाना()मानक यूनिक्स डीईएस-आधारित एल्गोरिदम या सिस्टम पर उपलब्ध वैकल्पिक एल्गोरिदम का उपयोग करके एक हैशेड स्ट्रिंग लौटाएगा।

नमक पैरामीटर वैकल्पिक है. तथापि, तहख़ाना()नमक के बिना एक कमजोर हैश बनाता है। PHP 5.6 या बाद का संस्करण इसके बिना एक E_NOTICE त्रुटि उत्पन्न करता है। बेहतर सुरक्षा के लिए पर्याप्त मजबूत नमक निर्दिष्ट करना सुनिश्चित करें।

पासवर्ड_हैश()एक मजबूत हैश का उपयोग करता है, एक मजबूत नमक उत्पन्न करता है, और स्वचालित रूप से उचित राउंड लागू करता है। पासवर्ड_हैश()एक सरल है तहख़ाना()रैपर और मौजूदा पासवर्ड हैश के साथ संगत। का उपयोग पासवर्ड_हैश()प्रोत्साहित किया जाता है।

कुछ ऑपरेटिंग सिस्टम एक से अधिक प्रकार के हैश का समर्थन करते हैं। वास्तव में, कभी-कभी मानक DES-आधारित एल्गोरिदम को MD5-आधारित एल्गोरिदम द्वारा प्रतिस्थापित किया जाता है। हैश प्रकार नमक तर्क से ट्रिगर होता है। 5.3 से पहले, PHP सिस्टम के क्रिप्ट () के आधार पर इंस्टॉल-समय पर उपलब्ध एल्गोरिदम का निर्धारण करेगा। यदि कोई नमक प्रदान नहीं किया गया है, तो PHP स्वचालित रूप से एक मानक दो वर्ण (डीईएस) नमक, या एक बारह वर्ण ( MD5), MD5 क्रिप्ट() की उपलब्धता के आधार पर। PHP एक स्थिरांक नाम सेट करता है CRYPT_SALT_LENGTHजो उपलब्ध हैश द्वारा अनुमत सबसे लंबे समय तक वैध नमक को इंगित करता है।

मानक DES-आधारित तहख़ाना()आउटपुट के पहले दो वर्णों के रूप में नमक लौटाता है। यह केवल str के पहले आठ वर्णों का उपयोग करता है, इसलिए समान आठ वर्णों से शुरू होने वाली लंबी स्ट्रिंग समान परिणाम उत्पन्न करेगी (जब समान नमक का उपयोग किया जाता है)।

उन प्रणालियों पर जहां क्रिप्ट () फ़ंक्शन कई हैश प्रकारों का समर्थन करता है, दिए गए प्रकार उपलब्ध है या नहीं, इसके आधार पर निम्नलिखित स्थिरांक 0 या 1 पर सेट किए जाते हैं:

  • CRYPT_STD_DES- वर्णमाला "./0-9A-Za-z" से दो वर्ण नमक के साथ मानक DES-आधारित हैश। नमक में अमान्य वर्णों का उपयोग करने से क्रिप्ट() विफल हो जाएगा।
  • CRYPT_EXT_DES- विस्तारित डेस-आधारित हैश। "नमक" एक 9-अक्षर वाली स्ट्रिंग है जिसमें एक अंडरस्कोर होता है जिसके बाद 4 बाइट्स पुनरावृत्ति गिनती और 4 बाइट्स नमक होता है। इन्हें मुद्रण योग्य वर्णों के रूप में एन्कोड किया गया है, प्रति वर्ण 6 बिट, पहले सबसे कम महत्वपूर्ण वर्ण। 0 से 63 तक के मानों को "./0-9A-Za-z" के रूप में एन्कोड किया गया है। नमक में अमान्य वर्णों का उपयोग करने से क्रिप्ट() विफल हो जाएगा।
  • CRYPT_MD5- $1$ से शुरू होने वाले बारह वर्ण वाले नमक के साथ MD5 हैशिंग
  • CRYPT_BLOWFISH- नमक के साथ ब्लोफिश हैशिंग इस प्रकार है: "$2a$", "$2x$" या "$2y$", दो अंकों का लागत पैरामीटर, "$", और वर्णमाला से 22 अक्षर "./0-9A- ज़-ज़"। नमक में इस श्रेणी के बाहर के वर्णों का उपयोग करने से क्रिप्ट() शून्य-लंबाई वाली स्ट्रिंग लौटाएगा। दो अंकों का लागत पैरामीटर अंतर्निहित ब्लोफ़िश-आधारित हैशिंग एल्गोरिथम के लिए पुनरावृत्ति गणना का आधार -2 लघुगणक है और 04-31 की सीमा में होना चाहिए, इस सीमा के बाहर के मान क्रिप्ट() को विफल कर देंगे। 5.3.7 से पहले PHP के संस्करण केवल नमक उपसर्ग के रूप में "$2a$" का समर्थन करते हैं: PHP 5.3.7 ने ब्लोफिश कार्यान्वयन में सुरक्षा कमजोरी को ठीक करने के लिए नए उपसर्ग पेश किए। कृपया सुरक्षा सुधार के पूर्ण विवरण के लिए देखें, लेकिन संक्षेप में कहें तो, केवल PHP 5.3.7 और बाद के संस्करण को लक्षित करने वाले डेवलपर्स को "$2a$" के बजाय "$2y$" का उपयोग करना चाहिए।
  • CRYPT_SHA256- सोलह अक्षर वाले नमक के साथ SHA-256 हैश, जिसके पहले $5$ लगा हुआ है। यदि नमक की डोरी "राउंड=" से शुरू होती है
  • CRYPT_SHA512- SHA-512 हैश के साथ सोलह अक्षर वाला नमक पहले से $6$ लगा हुआ है। यदि नमक की डोरी "राउंड=" से शुरू होती है $", एन के संख्यात्मक मान का उपयोग यह इंगित करने के लिए किया जाता है कि हैशिंग लूप को कितनी बार निष्पादित किया जाना चाहिए, ब्लोफिश पर लागत पैरामीटर की तरह। राउंड की डिफ़ॉल्ट संख्या 5000 है, न्यूनतम 1000 और अधिकतम 999,999,999 है। इस सीमा के बाहर N का कोई भी चयन निकटतम सीमा तक छोटा कर दिया जाएगा।

PHP 5.3.0 के अनुसार, PHP का अपना कार्यान्वयन है और यदि सिस्टम में एक या अधिक एल्गोरिदम के लिए समर्थन की कमी है तो इसका उपयोग किया जाएगा।

पैरामीटर

स्ट्रिंग को हैश किया जाना है.

सावधानी

का उपयोग CRYPT_BLOWFISHएल्गोरिथ्म, जिसके परिणामस्वरूप str पैरामीटर को अधिकतम 72 वर्णों की लंबाई तक छोटा कर दिया जाएगा।

हैशिंग को आधार बनाने के लिए एक वैकल्पिक नमक स्ट्रिंग। यदि प्रदान नहीं किया गया है, तो व्यवहार एल्गोरिदम कार्यान्वयन द्वारा परिभाषित किया गया है और अप्रत्याशित परिणाम दे सकता है।

वापसी मान

हैशेड स्ट्रिंग या एक स्ट्रिंग लौटाता है जो 13 वर्णों से छोटी है और विफलता पर नमक से भिन्न होने की गारंटी है।

चेतावनी

पासवर्ड को मान्य करते समय, आउटपुट की तुलना करने के लिए एक स्ट्रिंग तुलना फ़ंक्शन का उपयोग किया जाना चाहिए जो टाइमिंग हमलों के प्रति संवेदनशील नहीं है तहख़ाना()पहले से ज्ञात हैश के लिए. PHP 5.6 आगे प्रदान करता है हैश_बराबर()इस उद्देश्य से।

बदलाव का

संस्करण विवरण
5.6.5 जब विफलता स्ट्रिंग "*0" को salt के रूप में दिया जाता है, तो "*1" को अब अन्य क्रिप्ट कार्यान्वयन के साथ स्थिरता के लिए वापस कर दिया जाएगा। इस संस्करण से पहले, PHP 5.6 गलत तरीके से DES हैश लौटाता था।
5.6.0 यदि नमक छोड़ दिया गया है तो E_NOTICE सुरक्षा चेतावनी बढ़ाएँ।
5.5.21 जब विफलता स्ट्रिंग "*0" को salt के रूप में दिया जाता है, तो "*1" को अब अन्य क्रिप्ट कार्यान्वयन के साथ स्थिरता के लिए वापस कर दिया जाएगा। इस संस्करण से पहले, PHP 5.5 (और पिछली शाखाएँ) गलत तरीके से DES हैश लौटाता था।
5.3.7 जोड़ा $2x$और $2y$संभावित उच्च-बिट हमलों से निपटने के लिए ब्लोफ़िश मोड।
5.3.2 उलरिच ड्रेपर के कार्यान्वयन के आधार पर SHA-256 और SHA-512 क्रिप्ट जोड़ा गया।
5.3.2 डीईएस पर वापस जाने के बजाय, "विफलता" स्ट्रिंग ("* 0" या "* 1") को वापस करने के लिए अमान्य राउंड पर ब्लोफिश व्यवहार को ठीक किया गया।
5.3.0 PHP में अब MD5 क्रिप्ट, स्टैंडर्ड DES, एक्सटेंडेड DES और ब्लोफिश एल्गोरिदम के लिए अपना स्वयं का कार्यान्वयन शामिल है और यदि सिस्टम में एक या अधिक एल्गोरिदम के लिए समर्थन की कमी है तो इसका उपयोग किया जाएगा।

उदाहरण

उदाहरण 1 तहख़ाना()उदाहरण

$हैश_पासवर्ड = क्रिप्ट("मायपासवर्ड"); // नमक को स्वचालित रूप से उत्पन्न होने दें

/* आपको तुलना के लिए क्रिप्ट() के संपूर्ण परिणामों को नमक के रूप में पास करना चाहिए
पासवर्ड, विभिन्न हैशिंग एल्गोरिदम का उपयोग होने पर समस्याओं से बचने के लिए। (जैसा
यह ऊपर कहता है, मानक DES-आधारित पासवर्ड हैशिंग 2-वर्ण नमक का उपयोग करता है,
लेकिन एमडी5-आधारित हैशिंग 12 का उपयोग करता है।) */
यदि (हैश_बराबर ($हैश_पासवर्ड , क्रिप्ट ($ उपयोगकर्ता_इनपुट , $हैश_पासवर्ड ))) (
इको "पासवर्ड सत्यापित!" ;
}
?>

उदाहरण #2 का उपयोग करना तहख़ाना() htpasswd के साथ

// पासवर्ड सेट करें
$password = "mypassword" ;

// हैश प्राप्त करें, नमक को स्वचालित रूप से उत्पन्न होने दें
$हैश = क्रिप्ट($पासवर्ड);
?>

उदाहरण #3 का उपयोग करना तहख़ाना()विभिन्न हैश प्रकारों के साथ

/* ये साल्ट केवल उदाहरण हैं, और इन्हें आपके कोड में शब्दशः उपयोग नहीं किया जाना चाहिए।
आपको प्रत्येक पासवर्ड के लिए एक अलग, सही ढंग से प्रारूपित नमक उत्पन्न करना चाहिए।
*/
यदि (CRYPT_STD_DES == 1 ) (
इको "मानक डेस:"। क्रिप्ट ("रासमुसलरडोर्फ", "आरएल")। "\एन" ;
}

यदि (CRYPT_EXT_DES == 1 ) (
इको "विस्तारित डेस:"। क्रिप्ट ("Rasmuslerdorf", "_J9..rasm")। "\एन" ;
}

यदि (CRYPT_MD5 == 1 ) (
इको "एमडी5:"। क्रिप्ट ("Rasmuslerdorf", "$1$rasmusle$") . "\एन" ;
}

यदि (CRYPT_BLOWFISH == 1 ) (
इको "ब्लोफिश:"। क्रिप्ट ("रासमुसलरडोर्फ", "$2a$07$usesomesillystringforsalt$") . "\एन" ;
}

यदि (CRYPT_SHA256 == 1 ) (
इको "एसएचए-256:"। क्रिप्ट ("रासमुसलरडोर्फ", "$5$राउंड्स=5000$यूज़समसिलीस्ट्रिंगफोरसाल्ट$") . "\एन" ;
}

यदि (CRYPT_SHA512 == 1 ) (
इको "एसएचए-512:"। क्रिप्ट ("रासमुसलरडोर्फ", "$6$राउंड्स=5000$यूज़समसिलीस्ट्रिंगफोरसाल्ट$") . "\एन" ;
}
?>

PHP का उपयोग करने सहित किसी भी जानकारी को एन्क्रिप्ट या डिक्रिप्ट किया जा सकता है। इस भाषा में सरल से लेकर जटिल तक कई डेटा एन्क्रिप्शन क्षमताएं हैं।

आइए बुनियादी एन्क्रिप्शन विधियों पर नजर डालें

बेस 64- आपको MIME बेस 64 एल्गोरिदम का उपयोग करके डेटा को एन्क्रिप्ट और डिक्रिप्ट करने की अनुमति देता है। यह कुंजियों का उपयोग नहीं करता है और अक्सर PHP में लिंक छिपाने के लिए उपयोग किया जाता है।

उदाहरण:
// टेक्स्ट को एन्क्रिप्ट करें
$पाठ = "लिंक";
इको बेस64_एनकोड($पाठ); //उत्पादन: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==
// डिक्रिप्शन
इको बेस64_डीकोड('PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==');
?>

जैसा कि आप देख सकते हैं, हमने सबसे पहले Base64_encode ऑपरेशन का उपयोग किया और सिफर प्राप्त किया: PGEgaHJlZj0iIyI+0KHRgdGL0LvQutCwPC9hPg==, और फिर इसे Base64_decode में प्रतिस्थापित कर दिया और लिंक वापस प्राप्त कर लिया।

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

उदाहरण:

// टेक्स्ट को एन्क्रिप्ट करें
इको एमडी5('संयोजन');
?>

कुंजी एन्क्रिप्शन

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

फ़ंक्शन __encode($text, $key) (



$enc_text=base64_encode(mcrypt_generic($td,$iv.$text));
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
वापसी $enc_text; ) )
फ़ंक्शन strToHex($string) (
$हेक्स='';
($i=0; $i के लिए< strlen($string); $i++) { $hex .= dechex(ord($string[$i])); }
वापसी $हेक्स; )
फ़ंक्शन __डिकोड($पाठ, $कुंजी) (
$td = mcrypt_module_open("tripledes", "", "cfb", "");
$iv_size = mcrypt_enc_get_iv_size($td);
$iv = mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_RAND);
यदि (mcrypt_generic_init ($td, $key, $iv) != -1) (
$decode_text = पदार्थ(mdecrypt_generic($td, Base64_decode($text)),$iv_size);
mcrypt_generic_deinit($td);
mcrypt_module_close($td);
$decode_text लौटाएँ; ) )
फ़ंक्शन hexToStr($hex) (
$स्ट्रिंग='';
($i=0; $i के लिए< strlen($hex)-1; $i+=2) { $string .= chr(hexdec($hex[$i].$hex[$i+1])); }
वापसी $स्ट्रिंग; )

$str = "बन्स जिन्हें एन्क्रिप्ट करने की आवश्यकता है!
कुंजी से";
$कोड = strToHex(__encode($str, "My#key-do-36-simvolov"));
इको "एन्क्रिप्टेड कोड: ".$कोड।"
";

$str = __decode(hexToStr($code), "My#key-do-36-simvolov");
इको "डिक्रिप्टेड कोड: ".$str।"
";
?>

आप html सामग्री को एन्क्रिप्ट कर सकते हैं. कुंजी की लंबाई 36 वर्णों से अधिक नहीं होनी चाहिए.

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

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

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

स्पष्ट कारणों से, हम एईएस जैसे औद्योगिक क्रिप्टोग्राफी के दिग्गजों को निशाना नहीं बनाएंगे, बल्कि लाठी और खुशी के साथ अपने स्वयं के क्रिप्टोग्राफ़िक अनुसंधान में उतरेंगे।

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

लेकिन पानी पहले से ही पर्याप्त है।

मान लीजिए कि हमारा वेब एप्लिकेशन PHP में लिखा गया है, उसे प्रतिवर्ती एन्क्रिप्शन की आवश्यकता है, और हमारा मानना ​​है कि हम अपना स्वयं का सिफर सिस्टम लिख सकते हैं।

तो, आइए निजी और सार्वजनिक कुंजी के साथ अपना स्वयं का प्रतिवर्ती एन्क्रिप्शन सिस्टम लिखें, जिसमें कमोबेश सुरक्षित क्रिप्टोग्राफ़िक एल्गोरिदम की निम्नलिखित विशेषताएं होंगी:

  1. अंतिम सिफर में शोर प्रतीकों की उपस्थिति.
  2. प्रत्येक प्रेषक-गंतव्य चैनल में जानकारी एक निजी कुंजी का उपयोग करके एन्क्रिप्ट की जाएगी, और मिलान फ़ंक्शन प्रत्येक कुंजी के लिए अद्वितीय होगा।
  3. प्रत्येक संदेश को एक डाइजेस्ट कोड प्राप्त होगा - एक अद्वितीय कोड जो निजी कुंजी और मूल संदेश का एक कार्य है। "स्रोत प्रतीक" मिलान फ़ंक्शन की विशिष्टता प्राप्त करने के लिए यह आवश्यक है<=>एन्कोडेड प्रतीक" न केवल "प्रेषक-प्राप्तकर्ता" चैनल के लिए, बल्कि प्रत्येक व्यक्तिगत संदेश के लिए भी।

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

  4. आवृत्ति विश्लेषण को जटिल बनाने के लिए, हम प्रत्येक प्रारंभिक संदेश प्रतीक को दो सिफर प्रतीकों के साथ एन्कोड करेंगे।
तो क्या हुआ।

वास्तव में, आप अंतिम परिणाम देख सकते हैं

SymCoder वर्ग में एन्क्रिप्शन और डिक्रिप्शन विधियाँ शामिल हैं।

एन्क्रिप्शन कोड() विधि द्वारा किया जाता है, जो मूल संदेश को इनपुट के रूप में लेता है।

यहां, tab_coded में उत्पन्न पत्राचार तालिका से एक संदेश एक एन्क्रिप्टेड संदेश बनाता है, जो किनारों के साथ और अंदर शोर प्रतीकों के साथ पतला होता है।

वैसे, प्रत्येक प्रेषक-गंतव्य चैनल के लिए शोर प्रतीक अद्वितीय होते हैं, क्योंकि वे चैनल कुंजी का उपयोग करके उत्पन्न होते हैं, लेकिन संदेशों के लिए अद्वितीय नहीं होते हैं। Code_symbols में एन्क्रिप्शन के लिए उपयोग किए जाने वाले प्रतीक कुछ विराम चिह्न और प्रतीक हैं जैसे %, @, आदि।

प्रत्येक एन्कोडेड प्रतीक के लिए, कोड_सिंबल्स से दो प्रतीक होते हैं, स्पष्ट कारणों से कि एन्कोडेड प्रतीकों की तुलना में उनमें से कई गुना कम हैं।

Create_tab_coded पत्राचार तालिका कोड प्रतीक सरणी में तत्वों की संख्या के बराबर तत्वों की संख्या के साथ एक सरणी में संदेश कुंजी हैश के अनुवाद का उपयोग करके बनाई गई है। दो-वर्ण कोड को पार करने के लिए प्रारंभिक स्थिति भी हमेशा अलग होती है और चैनल कुंजी से जुड़ी होती है। इससे यह सुनिश्चित करना संभव हो जाता है कि एन्कोडेड प्रतीकों को पार करने और उनसे मिलान करने वाले कोड प्रतीकों के लिए एल्गोरिदम हमेशा अलग होगा (या अक्सर गारंटी दी जाती है)।

उदाहरण के लिए, "हैलो वर्ल्ड" संदेश, एन्कोड होने पर, इस तरह दिखता है:

डाइजेस्ट-a00bf11d-&?==&!&?.@.@=!=-.?&1.#&?=:.:.1%!&-%@&@%~&1^#=?%% .!%+.?.~=?..&?%&&:%~.#%@&1&1.#=?.#.?.!&1==&=.-=!

और यहाँ वही संदेश है, जो फिर से एन्कोड किया गया है:

डाइजेस्ट-a00bf11d-=:.?=:&!.?.1&-=:=?.?.=.?.!&=%!=-%@=!%~.=^#.1%%. !%+=:.~.@..==%&&1%~.1%@=?.@.!&=.!&@=:&1.==:=!.1&:

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

संदेशों में अतिरेक होता है, जो संदेश की मात्रा बढ़ने पर कम हो जाता है, 10% शोर तक (सबसे छोटे संदेशों के लिए, शोर 90% या अधिक प्रतिशत तक पहुंच जाता है), एन्क्रिप्टेड संदेश की न्यूनतम लंबाई 116 अक्षर है। इस एन्क्रिप्शन विधि का एक नुकसान यह है कि एन्कोडेड संदेश कम से कम दोगुने हो जाते हैं।

डिकोडिंग में "कोड प्रतीक" फॉर्म का रिवर्स अनुवाद शामिल है - संदेश से शोर काट दिया गया मूल प्रतीक। कुंजी क्या हो सकती है? मूलतः, कोई भी स्ट्रिंग जो प्रत्येक गंतव्य-रिसीवर जोड़ी के लिए अद्वितीय होती है।

उदाहरण के लिए, यदि आप संदेश एन्क्रिप्शन के साथ एक मैसेंजर बना रहे हैं, तो निजी कुंजी का सबसे सरल संस्करण md5($user_id_1. $salt. $user_id_2) हो सकता है, फिर कुंजी प्रत्येक संदेश चैनल के लिए अद्वितीय होगी।

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

छद्म-एन्क्रिप्शन के एक अन्य उदाहरण के रूप में, मैं एक सीएमएस के डेटाबेस में पासवर्ड के "एन्क्रिप्शन" का एक उदाहरण दूंगा - वहां पासवर्ड md5() या में एन्क्रिप्ट नहीं किए जाते हैं, बल्कि केवल बेस 64 के माध्यम से एन्कोड किए जाते हैं। वे। जब डेटाबेस लीक हो जाता है, तो हैकर के लिए अंतर्निहित PHP फ़ंक्शन बेस64_डीकोड() का उपयोग करके सभी पासवर्ड को डिक्रिप्ट करना मुश्किल नहीं होगा।

हमें इस बात की चिंता किए बिना डेटा संचारित करने की आवश्यकता है कि कोई टेक्स्ट को इंटरसेप्ट करने और उसे डिक्रिप्ट करने में सक्षम होगा। PHP में Mcrypt नामक एक लोकप्रिय डेटा एन्क्रिप्शन पैकेज है, जो दो-तरफा एन्क्रिप्शन (यानी, डेटा का वास्तविक एन्क्रिप्शन और डिक्रिप्शन) प्रदान करता है।

मैक्रिप्ट संस्करण 2.4.7 निम्नलिखित सममित एन्क्रिप्शन एल्गोरिदम का समर्थन करता है: ब्लोफिश, आरसी2, सेफ़र-स्क64 xtea, कास्ट-256, आरसी4, सेफ़र-स्क128, डीईएस, आरसी4-iv, सर्पेंट, एनिग्मा, रिजेंडेल-128, थ्रीवे, रिजेंडेल-192 , ट्रिपलडीईएस, लोकी97, रिजेंडेल-256, टूफिश, पनामा, सेफ़रप्लस, आदि। प्रत्येक एल्गोरिदम के बारे में अधिक विवरण विकिपीडिया पर लिखे गए हैं।

चूँकि सममित एन्क्रिप्शन का उपयोग किया जाता है, कुंजी दोनों पक्षों को ज्ञात होनी चाहिए और गुप्त रखी जानी चाहिए।

एक स्ट्रिंग के एन्क्रिप्शन और डिक्रिप्शन का उदाहरण

mcrypt_module_open("des", "", "ecb", "")
यह फ़ंक्शन एल्गोरिदम मॉड्यूल और उपयोग किए गए मोड को खोलता है। इस उदाहरण के लिए, DES एल्गोरिथम ECB मोड में है।

$कुंजी = पदार्थ($कुंजी, 0, mcrypt_enc_get_key_size($td));
अधिकतम कुंजी आकार mcrypt_enc_get_key_size() फ़ंक्शन को कॉल करके प्राप्त किया जाना चाहिए, और इससे कम कोई भी मान सही होगा।

$s = mcrypt_generic($td, $source);
एन्क्रिप्ट करते समय, डेटा को शून्य बाइट्स के साथ पैड किया जाता है ताकि यह सुनिश्चित किया जा सके कि डेटा n*ब्लॉक आकार लंबा है। ब्लॉक का आकार ब्लॉकसाइज़ एल्गोरिदम द्वारा निर्धारित किया जाता है (डीईएस के लिए ब्लॉक का आकार 64 बिट है)। इसलिए, डिक्रिप्ट करते समय, "\0" पंक्ति के अंत में दिखाई दे सकता है, जिसे ट्रिम() फ़ंक्शन द्वारा हटा दिया जाता है