2010-10-30 14 views
5

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

वैसे भी, मैं RIJNDAEL 256.

function encrypt($text, $key) 
{ 
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_256,$key,$text,MCRYPT_MODE_ECB,mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_ECB),MCRYPT_RAND)); 
} 

का उपयोग कर उपयोग में कौन सा (base64 प्रदर्शन के लिए इनकोडिंग) कुछ इस तरह

print base64_encode(encrypt('text', 'key')); 

7s6RyMaYd4yAibXZJ3C8EuBtB4F0qfJ31xu1tXm8Xvw= 

उत्पादन होता कुकी सामग्री को एन्क्रिप्ट करने पर योजना मैं चिंतित नहीं हूँ लगभग एक ही उपयोगकर्ता कुकी के साथ समझौता किया जा रहा है जितना मुझे चिंता है कि एक हमलावर key खोजेगा और किसी भी उपयोगकर्ता के लिए कोई भी सत्र बनाने में सक्षम होगा क्योंकि उन्हें पता है कि क्या मैं डेटा पर हस्ताक्षर करने के लिए उपयोग करता हूं।

क्या कोई तरीका है कि मैं इस्तेमाल किए गए पैरामीटर के संबंध में अनुमानित क्रैकिंग समय सत्यापित कर सकता हूं? या क्या टेक्स्ट या कुंजी के आकार के संबंध में मानक समय है?

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

डेटा आम तौर पर लगभग 200 अक्षरों

a:3{s:7:"user_id";i:345;s:5:"token";s:32:"0c4a14547ad221a5d877c2509b887ee6";s:4:"lang";s:2:"en";} 

तो यह सुरक्षित है हो जाएगा?

उत्तर

2

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

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

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

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

सारांश में, कुंजी की रक्षा केवल हिमशैल की नोक है।

+0

एक चौथाई बनाने के बाद मैंने इसे एन्क्रिप्टेड टेक्स्ट पर जोड़ा। फिर मैंने एक SHA256 एचएमएसी बनाया (उसी कुंजी से पाठ को एन्क्रिप्ट करने के लिए इस्तेमाल किया गया + एन्क्रिप्टेड टेक्स्ट)। तो डेटा प्राप्त करते समय अब ​​मैं एचएमएसी की जांच करता हूं - और यदि वैध है तो डेटा को डिक्रिप्ट करने के लिए आगे बढ़ें। इसके अलावा, डेटा के अंदर मेरे पास टाइमस्टैम्प है इसलिए मैं सत्यापित कर सकता हूं कि डेटा न केवल * सही और मेरे द्वारा भेजा गया है * - इसे समय-समय पर भेजा जाता है। – Xeoncross

2

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

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

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

भले ही आप एक निश्चित कुंजी के साथ सीधे एन्क्रिप्शन के साथ जाते हैं, तो डेटा को एन्क्रिप्टेड होने के साथ यादृच्छिक संख्या शामिल करने पर विचार करें - इससे ज्ञात सादे टेक्स्ट हमले का उपयोग करना क्रैक करना मुश्किल हो जाता है क्योंकि परिभाषा के अनुसार, यादृच्छिक संख्या ' टी ज्ञात नहीं है।

+1

एईएस रिजेंडेल का एक विशेष मामला है। एईएस में 128 बिट की एक निश्चित ब्लॉक लंबाई है, रिजेंडेल की 128, 1 9 2 या 256 बिट की एक परिवर्तनीय ब्लॉक लंबाई है। –

+0

@ जुरी: एईएस-128 रिजेंडेल-128 है; एईएस -192 रिजेंडेल -192 है; और (आश्चर्य, आश्चर्य), एईएस -256 रिजेंडेल -256 है। सभी एईएस दावेदारों को 128, 1 9 2 और 256 बिट्स की लंबाई में एक 128-बिट ब्लॉक आकार और चाबियां प्रदान करनी थीं। –

+1

हां, यह सही है, लेकिन रिजेंडेल (128 से 256) में अभी भी परिवर्तनीय ब्लॉक लंबाई है, जबकि एईएस नहीं है। –

0

एईएस-128 पर्याप्त से अधिक होना चाहिए, लंबी चाबियों का उपयोग करने की आवश्यकता नहीं है - अगर कुंजी को यादृच्छिक रूप से चुना जाता है।

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

दूसरा मुद्दा यह है कि आपको एक संदेश प्रमाणीकरण कोड भी जोड़ना चाहिए। अन्यथा आप जाली कुकीज़ को अच्छे से अलग करने में सक्षम नहीं होंगे।

2

यदि आप लंबी कुंजी का उपयोग करते हैं, तो मैं कहूंगा कि कुंजी बहुत सुरक्षित थी। कुछ चीजों को स्वयं से चिंता करने के लिए:

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

डेटा मान्य करने के लिए कैसे के कुछ उदाहरण होगा:

  • एक नमक में शामिल हैं (ताकि एक ही सत्र डेटा के साथ लोगों को एक ही कुकी नहीं मिल कि है) तो और
  • चेकसम (कि कोई भी जो कुकी के एक बिट को भी बदलता है वह बेकार बनाता है)।
+0

ईसीबी के बजाय एचएमएसी और सीबीसी मोड का उपयोग इन दोनों को हल करता है। – Xeoncross

14

हाँ रिजेंडेल (एईएस) सुरक्षित है, हालांकि आपका कार्यान्वयन सुरक्षित से बहुत दूर है। आपके कार्यान्वयन के साथ 2 उत्कृष्ट मुद्दे हैं। ईसीबी मोड और आपके चतुर्थ का उपयोग एक स्थिर चर है जो सभी संदेशों के लिए उपयोग किया जाएगा। An IV must always be a Cryptographic Nonce। आपका कोड सीडब्ल्यूई -32 9 के स्पष्ट उल्लंघन में है।

ईसीबी मोड, प्रयोग नहीं करना चाहिए सीबीसी मोड इस्तेमाल किया जाना चाहिए और इस कारण है कि:

मूल:

alt text

ईसीबी मोड के साथ एन्क्रिप्टेड:

alt text

एन्क्रिप्टेड सीबीसी मोड का उपयोग करना:

alt text