Php में डेटा को एन्क्रिप्ट / डिक्रिप्ट कैसे करें?


110

मैं वर्तमान में एक छात्र हूं और मैं PHP का अध्ययन कर रहा हूं, मैं PHP में डेटा का एक सरल एन्क्रिप्ट / डिक्रिप्ट बनाने की कोशिश कर रहा हूं। मैंने कुछ ऑनलाइन शोध किए और उनमें से कुछ काफी भ्रमित थे (कम से कम मेरे लिए)।

यहाँ मैं क्या करने की कोशिश कर रहा हूँ:

मेरे पास इन क्षेत्रों से मिलकर एक तालिका है (UserID, Fname, Lname, ईमेल, पासवर्ड)

जो मैं करना चाहता हूं वह सभी क्षेत्रों को एन्क्रिप्ट किया गया है और फिर डिक्रिप्ट किया जा सकता है (क्या sha256एन्क्रिप्शन / डिक्रिप्शन के लिए उपयोग करना संभव है , यदि कोई एन्क्रिप्शन एल्गोरिथ्म नहीं है)

एक और बात मैं सीखना चाहता हूं कि hash(sha256)एक अच्छा "नमक" के साथ संयुक्त एक तरीका कैसे बनाया जाए । (मूल रूप से मैं केवल एन्क्रिप्शन / डिक्रिप्शन, hash(sha256)+salt) सर / मैम का एक सरल कार्यान्वयन करना चाहता हूं , आपके उत्तर बहुत मदद करेंगे और बहुत सराहना करेंगे। धन्यवाद ++।




9
SHA एक हैश है, एन्क्रिप्शन नहीं है। मुख्य बिंदु यह है कि एक हैश मूल डेटा के लिए उलट नहीं किया जा सकता है (आसानी से, वैसे भी नहीं)। आप शायद mcrypt चाहते हैं या अगर यह उपलब्ध नहीं है, तो मैं phpseclib की सिफारिश करूंगा - हालांकि यह ध्यान रखना महत्वपूर्ण है कि किसी भी चीज के शुद्ध- PHP कार्यान्वयन में बहुत अधिक निम्न-स्तरीय गणित शामिल है, sloooooowww होगा ... यही कारण है कि मुझे phececlib पसंद है, क्योंकि यह उपलब्ध होने पर पहले mcrypt का उपयोग करता है और केवल अंतिम उपाय के रूप में PHP कार्यान्वयन पर वापस आता है।
डेवग्रैंडम

7
आप आम तौर पर एक पासवर्ड को डिक्रिप्ट करने में सक्षम नहीं होना चाहते हैं!
Ja͢ck

1
मूल रूप से आपको इस स्तर पर एन्क्रिप्शन के बारे में नहीं सोचना चाहिए, आपको एक्सेस कंट्रोल, गोपनीयता, अखंडता और प्रमाणीकरण के बारे में सोचना चाहिए। उसके बाद जांचें कि आप इसे कैसे प्राप्त कर सकते हैं, संभवतः एन्क्रिप्शन या सुरक्षित हैशिंग का उपयोग कर रहे हैं। आप पासवर्ड के सुरक्षित हैशिंग को समझने के लिए PBKDF2 और bcrypt / scrypt में पढ़ना चाह सकते हैं।
Maarten Bodewes

जवाबों:


289

प्रस्तावना

आपकी तालिका परिभाषा के साथ शुरू:

- UserID
- Fname
- Lname
- Email
- Password
- IV

ये परिवर्तन हैं:

  1. खेतों Fname, Lnameऔर OpenSSLEmail द्वारा प्रदान की गई, एक सममित सिफर का उपयोग करके एन्क्रिप्ट किया जाएगा ।
  2. IVक्षेत्र स्टोर करेगा initialisation वेक्टर एन्क्रिप्शन के लिए इस्तेमाल किया। भंडारण आवश्यकताओं का उपयोग सिफर और मोड पर निर्भर करता है; इसके बारे में बाद में।
  3. Passwordक्षेत्र एक का उपयोग कर टुकड़ों में बांटा हो जाएगा एक तरह से , पासवर्ड हैश

एन्क्रिप्शन

सिफर और मोड

सर्वश्रेष्ठ एन्क्रिप्शन सिफर और मोड का चयन करना इस उत्तर के दायरे से परे है, लेकिन अंतिम विकल्प एन्क्रिप्शन कुंजी और आरंभीकरण वेक्टर दोनों के आकार को प्रभावित करता है; इस पोस्ट के लिए हम AES-256-CBC का उपयोग करेंगे जिसमें 16 बाइट्स का एक निश्चित ब्लॉक आकार और 16, 24 या 32 बाइट्स का एक महत्वपूर्ण आकार है।

कूटलेखन कुंजी

एक अच्छी एन्क्रिप्शन कुंजी एक बाइनरी बूँद है जो एक विश्वसनीय यादृच्छिक संख्या जनरेटर से उत्पन्न होती है। निम्नलिखित उदाहरण की सिफारिश की जाएगी (> = 5.3):

$key_size = 32; // 256 bits
$encryption_key = openssl_random_pseudo_bytes($key_size, $strong);
// $strong will be true if the key is crypto safe

यह एक या कई बार किया जा सकता है (यदि आप एन्क्रिप्शन कुंजी की एक श्रृंखला बनाना चाहते हैं)। इन्हें यथासंभव निजी रखें।

चतुर्थ

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

IV उत्पन्न करने में आपकी सहायता के लिए एक फ़ंक्शन प्रदान किया गया है:

$iv_size = 16; // 128 bits
$iv = openssl_random_pseudo_bytes($iv_size, $strong);

उदाहरण

आइए पहले $encryption_keyऔर का उपयोग करके नाम फ़ील्ड को एन्क्रिप्ट करें $iv; ऐसा करने के लिए, हमें अपने डेटा को ब्लॉक आकार में पैड करना होगा:

function pkcs7_pad($data, $size)
{
    $length = $size - strlen($data) % $size;
    return $data . str_repeat(chr($length), $length);
}

$name = 'Jack';
$enc_name = openssl_encrypt(
    pkcs7_pad($name, 16), // padded data
    'AES-256-CBC',        // cipher and mode
    $encryption_key,      // secret key
    0,                    // options (not used)
    $iv                   // initialisation vector
);

भंडारण आवश्यकताओं

IV की तरह एन्क्रिप्टेड आउटपुट, बाइनरी है; डेटाबेस में इन मानों को संग्रहीत करने के लिए निर्दिष्ट कॉलम प्रकारों जैसे BINARYया का उपयोग करके पूरा किया जा सकता है VARBINARY

आईवी की तरह आउटपुट वैल्यू, बाइनरी है; MySQL में उन मूल्यों को संग्रहीत करने के लिए, उपयोग BINARYयाVARBINARY स्तंभों पर विचार करें । यदि यह एक विकल्प नहीं है, आप भी बाइनरी डेटा एक टेक्स्ट का प्रतिनिधित्व में का उपयोग कर परिवर्तित कर सकते हैं base64_encode()या bin2hex(), ऐसा करने से 100% अधिक संग्रहण स्थान के लिए 33% के बीच की आवश्यकता है।

डिक्रिप्शन

संग्रहीत मूल्यों का डिक्रिप्शन समान है:

function pkcs7_unpad($data)
{
    return substr($data, 0, -ord($data[strlen($data) - 1]));
}

$row = $result->fetch(PDO::FETCH_ASSOC); // read from database result
// $enc_name = base64_decode($row['Name']);
// $enc_name = hex2bin($row['Name']);
$enc_name = $row['Name'];
// $iv = base64_decode($row['IV']);
// $iv = hex2bin($row['IV']);
$iv = $row['IV'];

$name = pkcs7_unpad(openssl_decrypt(
    $enc_name,
    'AES-256-CBC',
    $encryption_key,
    0,
    $iv
));

प्रमाणित एन्क्रिप्शन

आप एक गुप्त कुंजी (एन्क्रिप्शन कुंजी से अलग) और सिफर पाठ से उत्पन्न हस्ताक्षर को जोड़कर उत्पन्न सिफर पाठ की अखंडता में और सुधार कर सकते हैं। इससे पहले कि सिफर पाठ को डिक्रिप्ट किया जाए, हस्ताक्षर पहले सत्यापित किया जाता है (अधिमानतः एक तुलनात्मक विधि के साथ)।

उदाहरण

// generate once, keep safe
$auth_key = openssl_random_pseudo_bytes(32, $strong);

// authentication
$auth = hash_hmac('sha256', $enc_name, $auth_key, true);
$auth_enc_name = $auth . $enc_name;

// verification
$auth = substr($auth_enc_name, 0, 32);
$enc_name = substr($auth_enc_name, 32);
$actual_auth = hash_hmac('sha256', $enc_name, $auth_key, true);

if (hash_equals($auth, $actual_auth)) {
    // perform decryption
}

यह सभी देखें: hash_equals()

हैशिंग

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

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

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

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

वर्तमान में दो लोकप्रिय विकल्प उपलब्ध हैं:

  1. PBKDF2 (पासवर्ड आधारित कुंजी व्युत्पत्ति कार्य v2)
  2. Bcrypt (उर्फ ब्लोफिश)

यह उत्तर bcrypt के साथ एक उदाहरण का उपयोग करेगा।

पीढ़ी

एक पासवर्ड हैश इस तरह उत्पन्न किया जा सकता है:

$password = 'my password';
$random = openssl_random_pseudo_bytes(18);
$salt = sprintf('$2y$%02d$%s',
    13, // 2^n cost factor
    substr(strtr(base64_encode($random), '+', '.'), 0, 22)
);

$hash = crypt($password, $salt);

नमक के साथ उत्पन्न होता है openssl_random_pseudo_bytes()डेटा जो तब के माध्यम से चलाया जाता है के एक यादृच्छिक ब्लॉब बनाने के लिए base64_encode()और strtr()के लिए जरूरी वर्णमाला मैच के लिए [A-Za-z0-9/.]

crypt()कार्य एल्गोरिथ्म (के आधार पर हैशिंग $2y$ब्लोफिश के लिए), लागत कारक और 22 अक्षरों के नमक (13 का एक पहलू एक 3GHz मशीन पर मोटे तौर पर 0.40s लेता है)।

मान्यकरण

एक बार जब आप उपयोगकर्ता की जानकारी वाली पंक्ति प्राप्त कर लेते हैं, तो आप पासवर्ड को इस तरीके से सत्यापित करते हैं:

$given_password = $_POST['password']; // the submitted password
$db_hash = $row['Password']; // field with the password hash

$given_hash = crypt($given_password, $db_hash);

if (isEqual($given_hash, $db_hash)) {
    // user password verified
}

// constant time string compare
function isEqual($str1, $str2)
{
    $n1 = strlen($str1);
    if (strlen($str2) != $n1) {
        return false;
    }
    for ($i = 0, $diff = 0; $i != $n1; ++$i) {
        $diff |= ord($str1[$i]) ^ ord($str2[$i]);
    }
    return !$diff;
}

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

PHP 5.5 के साथ पासवर्ड हैशिंग

PHP 5.5 ने पासवर्ड हैशिंग कार्यों को प्रस्तुत किया है जिसका उपयोग आप हैशिंग की उपरोक्त विधि को सरल बनाने के लिए कर सकते हैं:

$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 13]);

और पुष्टि:

if (password_verify($given_password, $db_hash)) {
    // password valid
}

यह भी देखें: password_hash(),password_verify()


सबसे सुरक्षित शर्त के लिए मुझे नाम, उपनाम, ईमेल आदि को स्टोर करने के लिए किस लंबाई का उपयोग करना चाहिए? varbinary (???)
बेंटकोडर

2
ज़रूर, लेकिन यह इस बात पर निर्भर करता है कि इसका उपयोग कैसे किया जा रहा है। यदि आप एन्क्रिप्शन लाइब्रेरी प्रकाशित करते हैं, तो आपको नहीं पता कि डेवलपर्स इसे कैसे लागू करेंगे। यही कारण है कि github.com/defuse/php-enc एन्क्रिप्शन प्रमाणित सिमेट्रिक-कुंजी एन्क्रिप्शन प्रदान करता है और डेवलपर्स को इसके कोड को संपादित किए बिना इसे कमजोर नहीं होने देता है।
स्कॉट आर्किसेवस्की

2
@ बहुत अच्छी तरह से, मैंने प्रमाणित एन्क्रिप्शन का एक उदाहरण जोड़ा है; पुश के लिए धन्यवाद :)
Ja͢ck

1
प्रमाणित एन्क्रिप्शन के लिए +1। इस सवाल में पर्याप्त जानकारी नहीं है कि एई यहां जरूरी नहीं है। निश्चित रूप से SQL ट्रैफ़िक अक्सर अज्ञात सुरक्षा गुणों वाले नेटवर्क पर चला जाता है, जैसा कि डेटाबेस से स्टोरेज तक ट्रैफ़िक करता है। बैकअप और प्रतिकृति भी। खतरा मॉडल क्या है? सवाल यह नहीं कहता है, और धारणा बनाना खतरनाक हो सकता है।
जेसन ओरेंडोर्फ

1
हार्ड-कोडिंग के बजाय $iv_size = 16;, मैं उपयोग करूंगा: $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length("AES-256-CBC"))उपयोग किए गए सिफर के साथ उपयोग करने के लिए iv के आकार के बीच लिंक को इंगित करने के लिए। आप pkcs7_pad()/ की आवश्यकता (या नहीं) पर थोड़ा विस्तार कर सकते हैं pkcs7_unpad(), या उनसे छुटकारा पाकर पोस्ट को सरल बना सकते हैं और "एईएस -255-ctr" का उपयोग कर सकते हैं। ग्रेट पोस्ट @ Ja16ck
पैट्रिक अलार्ट

24

मुझे लगता है कि यह पहले उत्तर दिया गया है ... लेकिन वैसे भी, यदि आप डेटा को एन्क्रिप्ट / डिक्रिप्ट करना चाहते हैं, तो आप SHA256 का उपयोग नहीं कर सकते

//Key
$key = 'SuperSecretKey';

//To Encrypt:
$encrypted = mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $key, 'I want to encrypt this', MCRYPT_MODE_ECB);

//To Decrypt:
$decrypted = mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $key, $encrypted, MCRYPT_MODE_ECB);

7
आपको उस मामले के लिए ईसीबी का उपयोग नहीं करना चाहिए।
Maarten Bodewes

7
चाबियाँ यादृच्छिक बाइट्स होनी चाहिए, या आपको एक सुरक्षित कुंजी व्युत्पत्ति फ़ंक्शन का उपयोग करना चाहिए।
Maarten Bodewes

4
MCRYPT_RIJNDAEL_256 एक मानकीकृत फ़ंक्शन नहीं है, आपको AES (MCRYPT_RIJNDAEL_128) का उपयोग करना चाहिए
Maarten Bodewes

14

उत्तर पृष्ठभूमि और स्पष्टीकरण

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

आप जो उपयोग करना चाहते हैं, वह दो-तरफा फ़ंक्शन है, लेकिन विशेष रूप से, एक ब्लॉक सिफर । एक फ़ंक्शन जो डेटा के एन्क्रिप्शन और डिक्रिप्शन दोनों के लिए अनुमति देता है। फ़ंक्शंस mcrypt_encryptऔर mcrypt_decryptडिफ़ॉल्ट रूप से ब्लोफ़िश एल्गोरिथ्म का उपयोग करते हैं। PHP के mcrypt का उपयोग इस मैनुअल में पाया जा सकता है । सिफर mcrypt उपयोग का चयन करने के लिए सिफर परिभाषाओं की एक सूची भी मौजूद है। ब्लोफ़िश पर एक विकी विकिपीडिया पर पाया जा सकता है । एक ब्लॉक सिफर एक ज्ञात कुंजी के साथ ज्ञात आकार और स्थिति के ब्लॉक में इनपुट को एन्क्रिप्ट करता है, ताकि बाद में कुंजी का उपयोग करके डेटा को डिक्रिप्ट किया जा सके। यह वही है जो SHA256 आपको प्रदान नहीं कर सकता है।

कोड

$key = 'ThisIsTheCipherKey';

$ciphertext = mcrypt_encrypt(MCRYPT_BLOWFISH, $key, 'This is plaintext.', MCRYPT_MODE_CFB);

$plaintext = mcrypt_decrypt(MCRYPT_BLOWFISH, $key, $encrypted, MCRYPT_MODE_CFB);

आपको उस मामले के लिए ईसीबी का उपयोग नहीं करना चाहिए।
Maarten Bodewes

चाबियाँ यादृच्छिक बाइट्स होनी चाहिए, या आपको एक सुरक्षित कुंजी व्युत्पत्ति फ़ंक्शन का उपयोग करना चाहिए।
Maarten Bodewes

4
कभी भी ईसीबी मोड का उपयोग करें। यह असुरक्षित है और ज्यादातर समय वास्तव में डेटा को एन्क्रिप्ट करने में मदद नहीं करता है (बल्कि इसे एन्कोडिंग के बजाय)। देखें इस विषय पर उत्कृष्ट विकिपीडिया लेख और जानकारी के लिए।
Holger Just

1
यह mcrypt का उपयोग नहीं करने के लिए सबसे अच्छा है, यह परित्याग है, वर्षों में अद्यतन नहीं किया गया है और मानक PKCS # 7 (ni PKCS # 5) पैडिंग का समर्थन नहीं करता है, केवल गैर-मानक अशक्त पैडिंग है जो बाइनरी डेटा के साथ भी उपयोग नहीं किया जा सकता है । mcrypt में 2003 के बाद से कई बकाया कीड़े थे । इसके बजाय डिफ्यूज़ का उपयोग करने पर विचार करें , इसे बनाए रखा जा रहा है और सही है।
zaph

9

यहाँ एक उदाहरण का उपयोग करता है जो कि शल्सि_नक्रॉफ्ट का उपयोग करता है

//Encryption:
$textToEncrypt = "My Text to Encrypt";
$encryptionMethod = "AES-256-CBC";
$secretHash = "encryptionhash";
$iv = mcrypt_create_iv(16, MCRYPT_RAND);
$encryptedText = openssl_encrypt($textToEncrypt,$encryptionMethod,$secretHash, 0, $iv);

//Decryption:
$decryptedText = openssl_decrypt($encryptedText, $encryptionMethod, $secretHash, 0, $iv);
print "My Decrypted Text: ". $decryptedText;

2
इसके बजाय mcrypt_create_iv(), मैं उपयोग करूंगा: openssl_random_pseudo_bytes(openssl_cipher_iv_length($encryptionMethod))इस तरह से कार्यप्रणाली $ एन्क्रिप्शनमेथोड के किसी भी मूल्य के लिए काम करती है और केवल ओपनस्लेस्ट एक्सटेंशन का उपयोग करेगी।
पैट्रिक अल्लार्ट

कोड रिटर्न ऊपर falseके लिए openssl_decrypt()। देखें stackoverflow.com/q/41952509/1066234 चूंकि एईएस जैसे ब्लॉक सिफर को इनपुट डेटा की आवश्यकता होती है, इसलिए ब्लॉक साइज का सटीक मल्टीपल होना चाहिए (एईएस के लिए 16-बाइट्स) पैडिंग आवश्यक है।
काई नोआक

6
     function my_simple_crypt( $string, $action = 'e' ) {
        // you may change these values to your own
        $secret_key = 'my_simple_secret_key';
        $secret_iv = 'my_simple_secret_iv';

        $output = false;
        $encrypt_method = "AES-256-CBC";
        $key = hash( 'sha256', $secret_key );
        $iv = substr( hash( 'sha256', $secret_iv ), 0, 16 );

        if( $action == 'e' ) {
            $output = base64_encode( openssl_encrypt( $string, $encrypt_method, $key, 0, $iv ) );
        }
        else if( $action == 'd' ){
            $output = openssl_decrypt( base64_decode( $string ), $encrypt_method, $key, 0, $iv );
        }

        return $output;
    }

बहुत आसान ! मैं इसे url खंड एन्क्रिप्शन-डिक्रिप्शन के लिए उपयोग करता हूं। धन्यवाद
महबूब टिटो

0

मुझे यह पता लगाने में काफी समय लग गया कि कैसे falseउपयोग करते समय नहीं मिलता है openssl_decrypt()और एन्क्रिप्ट और डिक्रिप्ट काम कर रहा है।

    // cryptographic key of a binary string 16 bytes long (because AES-128 has a key size of 16 bytes)
    $encryption_key = '58adf8c78efef9570c447295008e2e6e'; // example
    $iv = openssl_random_pseudo_bytes(openssl_cipher_iv_length('aes-256-cbc'));
    $encrypted = openssl_encrypt($plaintext, 'aes-256-cbc', $encryption_key, OPENSSL_RAW_DATA, $iv);
    $encrypted = $encrypted . ':' . base64_encode($iv);

    // decrypt to get again $plaintext
    $parts = explode(':', $encrypted);
    $decrypted = openssl_decrypt($parts[0], 'aes-256-cbc', $encryption_key, OPENSSL_RAW_DATA, base64_decode($parts[1])); 

यदि आप एक URL के माध्यम से एन्क्रिप्टेड स्ट्रिंग को पास करना चाहते हैं, तो आपको स्ट्रिंग को urlencode करने की आवश्यकता है:

    $encrypted = urlencode($encrypted);

यह समझने के लिए कि क्या चल रहा है, पढ़ें:

16 बाइट्स लंबे कुंजियों का उपयोग करने के लिए:

    $bytes = openssl_random_pseudo_bytes(16);
    $hex = bin2hex($bytes);

आप उपयोग कर सकते हैं खुलने के त्रुटि संदेश देखने के लिए: echo openssl_error_string();

उम्मीद है की वो मदद करदे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.