PHP को एन्क्रिप्ट और डिक्रिप्ट करने के लिए PHP का उपयोग करने का सबसे अच्छा तरीका?




mcrypt encryption (7)

सुरक्षा चेतावनी: यह कोड सुरक्षित नहीं है।

कामकाजी उदाहरण

define('SALT', 'whateveryouwant'); 

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

function decrypt($text) 
{ 
    return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, SALT, base64_decode($text), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); 
} 

$encryptedmessage = encrypt("your message"); 
echo decrypt($encryptedmessage); 

संभावित डुप्लिकेट:
PHP 2-way एन्क्रिप्शन: मुझे उन पासवर्ड को स्टोर करने की आवश्यकता है जिन्हें पुनर्प्राप्त किया जा सकता है

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

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

कोई सुझाव?


एन्क्रिप्शन से निपटने के दौरान आपको एक चीज़ के बारे में बहुत अवगत होना चाहिए:

चालाक होने और अपनी खुद की चीज का आविष्कार करने की कोशिश करने से आम तौर पर आपको कुछ असुरक्षित छोड़ दिया जाएगा।

PHP के साथ आने वाले क्रिप्टोग्राफ़ी एक्सटेंशन में से एक का उपयोग करके आप शायद सबसे अच्छा हो जाएंगे।


Mycrypt () देखें: http://us.php.net/manual/en/book.mcrypt.php

और यदि आप पोस्टग्रेज़ का उपयोग कर रहे हैं तो डेटाबेस स्तर एन्क्रिप्शन के लिए pgcrypto है। (खोज और क्रमबद्ध करना आसान बनाता है)


डेटाबेस में आपके डेटा को एन्क्रिप्ट / डिक्रिप्ट करने का सबसे अच्छा विचार है, भले ही आपके पास कोड तक पहुंच हो, प्रत्येक उपयोगकर्ता के लिए 2 अलग-अलग पास एक निजी पासवर्ड ( user-pass ) और सभी उपयोगकर्ताओं ( system-pass ) के लिए एक निजी कोड का उपयोग करना है।

परिदृश्य

  1. user-pass डेटाबेस में md5 के साथ संग्रहीत किया जाता है और प्रत्येक उपयोगकर्ता को सिस्टम में लॉगिन करने के लिए मान्य करने के लिए उपयोग किया जा रहा है। यह उपयोगकर्ता-पास प्रत्येक उपयोगकर्ता के लिए अलग है
  2. डेटाबेस में प्रत्येक उपयोगकर्ता प्रविष्टि md5 में डेटा के एन्क्रिप्शन / डिक्रिप्शन के लिए system-pass में है। यह सिस्टम-पास प्रत्येक उपयोगकर्ता के लिए समान है
  3. किसी भी समय सिस्टम से हटाए जा रहे किसी भी समय पुराने सिस्टम-पास के तहत एन्क्रिप्ट किए गए सभी डेटा को सुरक्षा समस्याओं से बचने के लिए एक नए सिस्टम-पास के तहत फिर से एन्क्रिप्ट किया जाना चाहिए।

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

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


Securiy चेतावनी : यह कोड असुरक्षित है । चुने गए-सिफरटेक्स्ट हमलों के प्रति संवेदनशील होने के अतिरिक्त, unserialize() पर इसकी निर्भरता इसे PHP ऑब्जेक्ट इंजेक्शन के लिए कमजोर बनाता है।

एक स्ट्रिंग / सरणी को संभालने के लिए मैं इन दो कार्यों का उपयोग करता हूं:

function encryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = strtr(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), serialize($stringArray), MCRYPT_MODE_CBC, md5(md5($key)))), '+/=', '-_,');
 return $s;
}

function decryptStringArray ($stringArray, $key = "Your secret salt thingie") {
 $s = unserialize(rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode(strtr($stringArray, '-_,', '+/=')), MCRYPT_MODE_CBC, md5(md5($key))), "\0"));
 return $s;
}

यह लचीला है क्योंकि आप URL के माध्यम से एक स्ट्रिंग या सरणी को स्टोर / भेज सकते हैं क्योंकि स्ट्रिंग / सरणी एन्क्रिप्शन से पहले serialzed है।


आपको पासवर्ड एन्क्रिप्ट नहीं करना चाहिए, इसके बजाय आपको उन्हें एसीगोरिदम का उपयोग करके हैश करना चाहिए जैसे bcrypt। यह उत्तर बताता है कि PHP में पासवर्ड हैशिंग को सही तरीके से कैसे कार्यान्वित किया जाए । फिर भी, यहां बताया गया है कि आप कैसे एन्क्रिप्ट / डिक्रिप्ट करेंगे:

$key = 'password to (en/de)crypt';
$string = ' string to be encrypted '; // note the spaces

एन्क्रिप्ट करने के लिए:

$iv = mcrypt_create_iv(
    mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC),
    MCRYPT_DEV_URANDOM
);

$encrypted = base64_encode(
    $iv .
    mcrypt_encrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        $string,
        MCRYPT_MODE_CBC,
        $iv
    )
);

डिक्रिप्ट करने के लिए:

$data = base64_decode($encrypted);
$iv = substr($data, 0, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC));

$decrypted = rtrim(
    mcrypt_decrypt(
        MCRYPT_RIJNDAEL_128,
        hash('sha256', $key, true),
        substr($data, mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_CBC)),
        MCRYPT_MODE_CBC,
        $iv
    ),
    "\0"
);

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

यह भी देखें:

  • https://.com/a/30189841/2224584
  • https://.com/a/30166085/2224584
  • https://.com/a/30159120/2224584

साथ ही, एन्क्रिप्शन कुंजी के लिए केवल "पासवर्ड" का उपयोग न करें। एन्क्रिप्शन कुंजी यादृच्छिक तार हैं।

3v4l.org पर डेमो :

echo 'Encrypted:' . "\n";
var_dump($encrypted); // "m1DSXVlAKJnLm7k3WrVd51omGL/05JJrPluBonO9W+9ohkNuw8rWdJW6NeLNc688="

echo "\n";

echo 'Decrypted:' . "\n";
var_dump($decrypted); // " string to be encrypted "




scramble