2009-09-07 13 views
28

मेरा एप्लिकेशन (स्पष्ट रूप से) रिकॉर्ड को अलग करने के लिए एक अद्वितीय आईडी का उपयोग करता है। यह यूआईडी अन्य चीजों के साथ यूआरएल (उदा। ./examplepage.php?UID=$example_int) में पारित किया गया है।PHP में दो-तरफा एन्क्रिप्शन

जबकि मेरे पास स्पष्ट रूप से सर्वर-साइड सत्यापन है, यह सुनिश्चित करने के लिए कि क्लाइंट अन्य क्लाइंट के डेटा तक नहीं पहुंच पाता है, क्या दो अलग-अलग एन्क्रिप्शन विधि है जिसका उपयोग मैं PHP में केवल एन्क्रिप्टेड यूआईडी (जैसे ./examplepage.php?EUID=$encrypted_int) पास करने के लिए कर सकता हूं, किसी को भी सोचने का मौका कम करने के लिए "हे, अगर मैं इस पूर्णांक में वृद्धि करता हूं तो क्या होता है?"

टीआईए।

+0

वोट दिया क्योंकि मुझे नहीं लगता था कि वार्तालाप वास्तव में लगभग दो-तरफा एन्क्रिप्शन होने वाला है ... –

उत्तर

-3

यह सुनिश्चित करने के लिए आईडी के बगल में हैश रखकर, या अतिरिक्त डेटा के साथ आईडी को पैडिंग करना, या आईडी को हेक्स में कनवर्ट करना भी मुझे लगता है कि यह काफी अच्छा काम करेगा।

+2

धन्यवाद, हेक्स में कनवर्ट करने पर अच्छा कॉल। – benjy

+0

हालांकि यह अगले हेक्स नंबर को आजमाने के लिए किसी भी "तकनीकी समझदार" से रक्षा नहीं करेगा। आप बस अड्डों को बदल रहे हैं, "संभावित" समस्या बनी हुई है। – rogeriopvl

+5

@benjy जो भी यूआईडी बढ़ाने के लिए पहल है, तुरंत हेक्स या गद्देदार int पहचान जाएगा। आपको वास्तव में क्या करना चाहिए @caf सुझाव दिया। या सिर्फ गैर-वृद्धिशील, गैर-अनुमानित यूआईडी उत्पन्न करना। – bucabay

3

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

  1. लोड भंडारण से पंक्ति प्रदान की आईडी से
  2. चेक पंक्ति के मालिक प्रमाणित उपयोगकर्ता और नहीं करता है, तो एक अपवाद फेंक और उपयोगकर्ता को सूचित कि नहीं करने के लिए फिर

लेकिन यदि आपका दिल हैशिंग पर सेट है तो बस एल्गोरिदम provided में से एक चुनें।

+0

सुझाव के लिए धन्यवाद। मैं वास्तव में पहले से ही ऐसा कर रहा हूं, लेकिन मैं सिर्फ उस मूल्य के साथ गड़बड़ करने से उपयोगकर्ताओं को विचलित करने का एक और तरीका चाहता था। – benjy

+0

निश्चित बात है। मैं आमतौर पर ऐसी चीजों के बारे में चिंता नहीं करता हूं। यदि आपके पास उचित एसीएल है तो उपयोगकर्ता आईडी के साथ गड़बड़ कर ऐसा कर सकता है। –

+0

दूसरे चरण को पहले अधिक प्रभावशाली नहीं बनायेगा? –

2

दो-तरफा एन्क्रिप्शन चेक mcrypt के लिए, या यदि आप शुद्ध कार्यान्वयन phpseclib पसंद करते हैं।

27

आप दो तरह से एन्क्रिप्शन जरूरत नहीं है - एन्क्रिप्शन गोपनीयता बनाए रखने के लिए है, लेकिन क्या तुम सच में यहाँ के लिए देख रहे प्रामाणिकता है।

एचएमएसी (अनिवार्य रूप से, कुंजी वाले हैंश) क्रिप्टोग्राफिक प्रामाणिकता प्राप्त करने का एक तरीका हैं। यूआईडी के एचएमएसी के साथ यूआईडी के साथ (PHP में HMAC implementation है), केवल उस कुंजी का उपयोग करके जो सर्वर जानता है। प्रत्येक अनुरोध की शुरुआत में, एचएमएसी की जांच करें।

मूल रूप से, सही नौकरी के लिए सही उपकरण का उपयोग करें।

+0

यह एक अतिरिक्त डीबी क्षेत्र की आवश्यकता है। मैं इसके साथ सहमत हूं, लेकिन इसे एक अतिरिक्त क्षेत्र में संग्रहीत करने की आवश्यकता है। –

+0

@AlexV: ऐसा नहीं है, क्योंकि अनुरोध होने पर सर्वर एचएमएसी को फिर से समझ सकता है। – caf

85

PHP 5.3 ने एक नई एन्क्रिप्शन विधि पेश की है जो वास्तव में उपयोग करना आसान है: openssl_encrypt और openssl_decrypt। यह यहाँ नहीं अच्छी तरह से प्रलेखित है, इसलिए यहाँ एक सरल उदाहरण है:

$textToEncrypt = "My super secret information."; 
$encryptionMethod = "AES-256-CBC"; // AES is used by the U.S. gov't to encrypt top secret documents. 
$secretHash = "25c6c7ff35b9979b151f2136cd13b0ff"; 

//To encrypt 
$encryptedMessage = openssl_encrypt($textToEncrypt, $encryptionMethod, $secretHash); 

//To Decrypt 
$decryptedMessage = openssl_decrypt($encryptedMessage, $encryptionMethod, $secretHash); 

//Result 
echo "Encrypted: $encryptedMessage <br>Decrypted: $decryptedMessage"; 

मैं 256 एईएस चुना है क्योंकि यह ठोस और तेज है। यू.एस. द्वारा इसे शीर्ष गुप्त दस्तावेजों को एन्क्रिप्ट करने के लिए अपनाया गया है। यह तेजी से मशीन और सॉफ्टवेयर पर विचार कर रहा है।यहां उपलब्ध एन्क्रिप्शन विधियों की एक सूची दी गई है:

एईएस-128-सीबीसी, एईएस-128-सीएफबी, एईएस-128-सीएफबी 1, एईएस-128-सीएफबी 8, एईएस-128-ईसीबी, एईएस-128-ओएफबी, एईएस- 1 9 2-सीबीसी, एईएस -192-सीएफबी, एईएस -192-सीएफबी 1, एईएस -192-सीएफबी 8, एईएस -192-ईसीबी, एईएस -192-ओएफबी, एईएस -256-सीबीसी, एईएस -256-सीएफबी, एईएस -256- सीएफबी 1, एईएस -256-सीएफबी 8, एईएस -256-ईसीबी, एईएस -256-ओएफबी, बीएफ-सीबीसी, बीएफ-सीएफबी, बीएफ-ईसीबी, बीएफ-ओएफबी, कैमेलिया-128-सीबीसी, कैमेलिया-128-सीएफबी, कैमेलिया- 128-सीएफबी 1, कैमेलिया-128-सीएफबी 8, कैमेलिया-128-ईसीबी, कैमेलिया-128-ओएफबी, कैमेलिया -192-सीबीसी, कैमेलिया -192-सीएफबी, कैमेलिया -192-सीएफबी 1, कैमेलिया -192-सीएफबी 8, कैमेलिया -192- ईसीबी, कैमेलिया -192-ओएफबी, कैमेलिया -256-सीबीसी, कैमेलिया -256-सीएफबी, कैमेलिया -256-सीएफबी 1, कैमेलिया -256-सीएफबी 8, कैमेलिया -256-ईसीबी, कैमेलिया -256-ओएफबी, सीएएसटी 5-सीबीसी, सीएएसटी 5- सीएफबी, सीएएसटी 5-ईसीबी, सीएएसटी 5-ओएफबी, डीईएस-सीबीसी, डीईएस-सीएफबी, डीईएस-सीएफबी 1, डीईएस-सीएफबी 8, डीईएस-ईसीबी, डीईएस-ईडीई, डीईएस-ईडीई-सीबीसी, डीईएस-ईडीई-सीएफबी, डीईएस-ईडीई- ओएफबी, डीईएस-ईडीई 3, डीईएस-ईडीई 3-सीबीसी, डीईएस-ईडीई 3-सीएफबी, डीईएस-ईडीई 3-सीएफबी 1, डीईएस-ईडीई 3-सीएफबी 8, डीईएस-ईडीई 3-ओएफबी, डीईएस-ओएफबी, डीईएसएक्स-सीबीसी, आरसी 2-40-सीबीसी, आरसी 2-64-सीबीसी, आरसी 2-सीबीसी, आरसी 2-सीएफबी, आरसी 2-ईसीबी, आरसी 2-ओएफबी, आरसी 4, आरसी 4-40, सीईडी-सीबीसी, सीईडी-सीएफबी, सीईडी-ईसीबी, सीईडी-ओएफबी, एएस-128-सीबीसी, एएस-128-सीएफबी, एएस-128-सीएफबी 1, एएस-128-सीएफबी 8, एएस-128-ईसीबी, एएस-128-ओबीबी, एएस -192-सीबीसी, एईएस -192- सीएफबी, एईएस -192-सीएफबी 1, एईएस -192-सीएफबी 8, एईएस -192-ईसीबी, एईएस -192-केबी, एएस -256-सीबीसी, एईएस -256-सीएफबी, एईएस -256-सीएफबी 1, एईएस -256-सीएफबी 8, एईएस -256-ईसीबी, एएस -256-ओबीबी, बीएफ-सीबीसी, बीएफ-सीएफबी, बीएफ-एसीबी, बीएफ-ऑफबी, कैमेलिया-128-सीबीसी, कैमेलिया-128-सीएफबी, कैमेलिया-128-सीएफबी 1, कैमेलिया-128- सीएफबी 8, कैमेलिया-128-एसीबी, कैमेलिया-128-ओबीबी, कैमेलिया -192-सीबीसी, कैमेलिया -192-सीएफबी, कैमेलिया -192-सीएफबी 1, कैमेलिया -192-सीएफबी 8, कैमेलिया -192-एसीबी, कैमेलिया -192-ओबीबी, कैमेलिया -256-सीबीसी, कैमेलिया -256-सीएफबी, कैमेलिया -256-सीएफबी 1, कैमेलिया -256-सीएफबी 8, कैमेलिया -256-एसीबी, कैमेलिया -256-ऑफबी, कास्ट 5-सीबीसी, कास्ट 5-सीएफबी, कास्ट 5-ईसीबी, कास्ट 5- ऑफबी, डेस-सीबीसी, डेस-सीएफबी, डेस-सीएफबी 1, डेस-सीएफबी 8, डेस-एर्ब, डेस-एडे, डेस-एडी-सीबीसी, डेस-एडी-सीएफबी, डेस-एडे-ऑफब, डेस-एडे 3, डेस- ede3-cbc, des-ede3-cfb, des-ede3-cfb1, des-ede3-cfb8, des-ede3-ofb, des-ofb, desx-cbc, rc2-40-cbc, rc2-64-cbc, rc2- सीबीसी, आर c2-Cfb, rc2-ईसीबी, rc2-ओएफबी, RC4, rc4-40, बीज सीबीसी, बीज Cfb, बीज ईसीबी,


महत्वपूर्ण अद्यतन बीज ओएफबी !!!

धन्यवाद Hobo और Jorwin यह इंगित करने के लिए PHP 5.3.3> एक नया पैरामीटर है जो इस कार्य को थोड़ा और सुरक्षित बनाता है।

Jorwin his comment में इस लिंक संदर्भित, और यहाँ एक अंश है कि लागू है:

5.3.3 में वे एक नया पैरामीटर, string $iv (आरंभीकरण वेक्टर) जोड़ा रियल मानकों हैं: string openssl_encrypt (string $data , string $method , string $password, bool $raw_output = false, string $iv)

यदि $iv गुम है, तो एक चेतावनी जारी की जाती है: "एक खाली प्रारंभिक वेक्टर (iv) का उपयोग संभावित रूप से असुरक्षित है और अनुशंसित नहीं है"।

हैं $iv, एक और चेतावनी बहुत छोटा है: "चतुर्थ पारित कर दिया केवल 3 बाइट्स लंबा है, सिफर \ 0 के साथ ठीक 8 बाइट्स की एक चतुर्थ, गद्दी की उम्मीद है"

ही चतुर्थ openssl_decrypt()

में इस्तेमाल किया जाना चाहिए
+0

दिखाए गए इस का उपयोग करके मुझे चेतावनी मिलती है "एक खाली प्रारंभिक वेक्टर (iv) का उपयोग करना संभावित रूप से असुरक्षित है और अनुशंसित नहीं है"। क्या यह एक नया पैरामीटर है? क्या यह उत्तर अपडेट किया जाना चाहिए? – Hobo

+2

@ होबो - आप सही हैं, मैं एक ही मुद्दे में भाग गया। यह एक और विस्तृत स्पष्टीकरण है। हालांकि उत्तर के लिए धन्यवाद espradley। http://php.net/manual/en/function.openssl-encrypt.php#104438 – Joe

+0

@ जॉविन - बिल्कुल सही। मैं PHP 5.2.2 पर हूं लेकिन 5.3.3 के रूप में आपको वास्तव में 5 वें पैरामीटर में पास होना होगा या चेतावनी प्राप्त करनी होगी। यह केवल एक चेतावनी है, इसलिए यह प्रति कहने वाले एप्लिकेशन को तोड़ नहीं देगा, लेकिन इसे पास करने के लिए यह अधिक सुरक्षित है। – espradley

0

पहला, encrypting URL parameters is usually a bad idea, और एक अलग लुकअप (एक सीएसपीआरएनजी द्वारा उत्पन्न सूचकांक CHAR कॉलम पर आधारित) 99.9% उपयोग मामलों के लिए बेहतर है।

इसके साथ कहा गया: हाँ, आप डेटा like espradley suggested डेटा एन्क्रिप्ट करने के लिए ओपनएसएसएल एक्सटेंशन (don't use mcrypt) का उपयोग कर सकते हैं, हालांकि मैं आपको केवल एन्क्रिप्शन पर रुकने के लिए चेतावनी दूंगा।

Encryption without message authentication is dangerous, विशेष रूप से यदि आप सिफरटेक्स्ट के साथ अंतिम उपयोगकर्ता पर भरोसा कर रहे हैं।

इसलिए, समाधान authenticated encryption का उपयोग करना है, जिसे आसानी से libsodium, available on PECL के साथ उपयोग किया जा सकता है।

यदि आप किसी भी कारण से पीईसीएल एक्सटेंशन स्थापित नहीं कर सकते हैं, तो defuse/php-encryption और zend-crypt से चुनने के लिए दो PHP पुस्तकालय हैं। वे दोनों मानकों को अनुपालन प्रमाणित एन्क्रिप्शन प्रदान करते हैं और वे दोनों सुरक्षित हैं (इसके लिए जो भी लायक है, मैं अक्सर PHP में code audits for cryptography implementations निष्पादित करता हूं, मैं केवल इंटरनेट पर कुछ यादृच्छिक व्यक्ति नहीं हूं)।

संबंधित मुद्दे