दिलचस्प पोस्ट
केवल एसक्यूएल का उपयोग पूर्व-अपस्टैट कॉलम मान वापस – PostgreSQL संस्करण एफ में "थ्रॉटलड" एसिंक डाउनलोड मैं स्थैतिक कक्षाएं क्यों नहीं दे सकता? JQuery में खोज और हाइलाइट करें एंड्रॉइड: Google सर्वर का उपयोग किए बिना भाषण मान्यता BuildActivity ToolVersion पर ध्यान नहीं देता CodeFile बनाम CodeBehind लिआ में वर्तमान क्षेत्र के लिए सभी स्थानीय चर तक पहुंचें हिटिंग <name> .cmake एक कस्टम निर्देशिका के साथ फ़ाइलें सी # में एक स्थैतिक निर्माता कहां है? एक नई खुली खिड़की पर सामग्री जोड़ें जावास्क्रिप्ट का उपयोग करके एक नया टैब (और एक नई विंडो नहीं) में एक यूआरएल खोलें क्षैतिज स्क्रॉलिंग ग्रिड दृश्य जुड़ने और पंक्ति-आधारित सीमित (पेजिंग) के साथ सीतनिद्रा में विशिष्ट परिणाम कैसे प्राप्त करें? एंड्रॉइड में बेस64 स्ट्रिंग में एन्कोड और डीकोड बिटमैप ऑब्जेक्ट

PHP एईएस एन्क्रिप्ट / डिक्रिप्ट

मुझे PHP में एन / डिकोडिंग स्ट्रिंग के लिए एक उदाहरण मिला। सबसे पहले यह बहुत अच्छा दिखता है लेकिन यह काम नहीं करता 🙁

क्या कोई जानता है कि परेशानी क्या है?

$Pass = "Passwort"; $Clear = "Klartext"; $crypted = fnEncrypt($Clear, $Pass); echo "Encrypted: ".$crypted."</br>"; $newClear = fnDecrypt($crypted, $Pass); echo "Decrypted: ".$newClear."</br>"; function fnEncrypt($sValue, $sSecretKey) { return trim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, $sDecrypted, MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND)))); } function fnDecrypt($sValue, $sSecretKey) { return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, base64_decode($sEncrypted), MCRYPT_MODE_ECB, mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), MCRYPT_RAND))); } 

परिणाम है:

एन्क्रिप्ट किया गया: boKRNTYYNp7AiOvY1CidqsAn9wX4ufz/D9XrpjAOPk8=

—‚(ÑÁ ^ yË~F'¸®Ó–í œð2Á_B‰Â— : —‚(ÑÁ ^ yË~F'¸®Ó–í œð2Á_B‰Â—

वेब के समाधान से एकत्रित समाधान "PHP एईएस एन्क्रिप्ट / डिक्रिप्ट"

$sDecrypted और $sEncrypted आपके कोड में अनिर्धारित थे एक समाधान देखें जो काम करता है ( लेकिन सुरक्षित नहीं है! ):


रुकें!

यह उदाहरण असुरक्षित है! इसका प्रयोग न करें!


 $Pass = "Passwort"; $Clear = "Klartext"; $crypted = fnEncrypt($Clear, $Pass); echo "Encrypred: ".$crypted."</br>"; $newClear = fnDecrypt($crypted, $Pass); echo "Decrypred: ".$newClear."</br>"; function fnEncrypt($sValue, $sSecretKey) { return rtrim( base64_encode( mcrypt_encrypt( MCRYPT_RIJNDAEL_256, $sSecretKey, $sValue, MCRYPT_MODE_ECB, mcrypt_create_iv( mcrypt_get_iv_size( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB ), MCRYPT_RAND) ) ), "\0" ); } function fnDecrypt($sValue, $sSecretKey) { return rtrim( mcrypt_decrypt( MCRYPT_RIJNDAEL_256, $sSecretKey, base64_decode($sValue), MCRYPT_MODE_ECB, mcrypt_create_iv( mcrypt_get_iv_size( MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB ), MCRYPT_RAND ) ), "\0" ); } 

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

कृपया एक मौजूदा सुरक्षित PHP एन्क्रिप्शन लाइब्रेरी का उपयोग करें

आमतौर पर आपके क्रिप्टोग्राफ़ी को लिखना एक बुरा विचार है, जब तक आपको अन्य लोगों के क्रिप्टोग्राफी लागू करने का अनुभव नहीं है।

यहां से कोई भी उदाहरण सिफरटेक्ट को प्रमाणित नहीं करता है , जिससे उन्हें बिट-रीरलाईटिंग हमलों के लिए कमजोर पड़ता है।

यदि आप पीईसीएल एक्सटेंशन स्थापित कर सकते हैं, तो libsodium भी बेहतर है

 <?php // PECL libsodium 0.2.1 and newer /** * Encrypt a message * * @param string $message - message to encrypt * @param string $key - encryption key * @return string */ function safeEncrypt($message, $key) { $nonce = \Sodium\randombytes_buf( \Sodium\CRYPTO_SECRETBOX_NONCEBYTES ); return base64_encode( $nonce. \Sodium\crypto_secretbox( $message, $nonce, $key ) ); } /** * Decrypt a message * * @param string $encrypted - message encrypted with safeEncrypt() * @param string $key - encryption key * @return string */ function safeDecrypt($encrypted, $key) { $decoded = base64_decode($encrypted); $nonce = mb_substr($decoded, 0, \Sodium\CRYPTO_SECRETBOX_NONCEBYTES, '8bit'); $ciphertext = mb_substr($decoded, \Sodium\CRYPTO_SECRETBOX_NONCEBYTES, null, '8bit'); return \Sodium\crypto_secretbox_open( $ciphertext, $nonce, $key ); } 

फिर इसे जांचने के लिए:

 <?php // This refers to the previous code block. require "safeCrypto.php"; // Do this once then store it somehow: $key = \Sodium\randombytes_buf(\Sodium\CRYPTO_SECRETBOX_KEYBYTES); $message = 'We are all living in a yellow submarine'; $ciphertext = safeEncrypt($message, $key); $plaintext = safeDecrypt($ciphertext, $key); var_dump($ciphertext); var_dump($plaintext); 

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

चूंकि लिबोडियम क्रॉस-प्लेटफॉर्म है , इसलिए यह PHP से संवाद करना आसान बनाता है, जैसे जावा एप्लेट या नेटिव मोबाइल एप्लिकेशन


नोट: यदि आपको विशेष रूप से एन्क्रिप्टेड कुकीज़ को अपने ऐप पर लिबोडियम द्वारा संचालित करने की आवश्यकता है, तो मेरा नियोक्ता पैरागॉन इनिशिएटिव एंटरप्राइजेज हॉलिट नामक एक पुस्तकालय का विकास कर रहा है जो आपके लिए यह सब करता है

जानकारी के लिए MCRYPT_MODE_ECB IV (प्रारंभिक वेक्टर) का उपयोग नहीं करता है। ईसीबी मोड आपके संदेश को ब्लॉक में विभाजित करता है और प्रत्येक ब्लॉक को अलग से एन्क्रिप्ट किया जाता है। मैं वास्तव में यह सिफारिश नहीं है

सीबीसी मोड प्रत्येक संदेश को अद्वितीय बनाने के लिए IV का उपयोग करता है। सीबीसी की सिफारिश की जाती है और इसका इस्तेमाल ईसीबी के बजाय किया जाना चाहिए।

उदाहरण :

 <?php $password = "myPassword_!"; $messageClear = "Secret message"; // 32 byte binary blob $aes256Key = hash("SHA256", $password, true); // for good entropy (for MCRYPT_RAND) srand((double) microtime() * 1000000); // generate random iv $iv = mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_CBC), MCRYPT_RAND); $crypted = fnEncrypt($messageClear, $aes256Key); $newClear = fnDecrypt($crypted, $aes256Key); echo "IV: <code>".$iv."</code><br/>". "Encrypred: <code>".$crypted."</code><br/>". "Decrypred: <code>".$newClear."</code><br/>"; function fnEncrypt($sValue, $sSecretKey) { global $iv; return rtrim(base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, $sValue, MCRYPT_MODE_CBC, $iv)), "\0\3"); } function fnDecrypt($sValue, $sSecretKey) { global $iv; return rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $sSecretKey, base64_decode($sValue), MCRYPT_MODE_CBC, $iv), "\0\3"); } 

आपको प्रत्येक संदेश (आईवी गुप्त नहीं हैं) को डीकोड करने के लिए चौथा शेयर करना होगा। प्रत्येक संदेश अद्वितीय है क्योंकि प्रत्येक संदेश में एक अद्वितीय IV है I

  • आपरेशन के मोड (विकिपीडिया) के बारे में और जानकारी।

एईएस एन्क्रिप्शन के साथ कुछ महत्वपूर्ण बातें ध्यान दें:

  1. एन्क्रिप्शन कुंजी के रूप में कभी भी सादे पाठ का उपयोग न करें हमेशा सादे पाठ कुंजी हैश और फिर एन्क्रिप्शन के लिए उपयोग करें।
  2. एन्क्रिप्शन और डिक्रिप्शन के लिए हमेशा यादृच्छिक IV (प्रारंभिक वेक्टर) का उपयोग करें। सच यादृच्छिकता महत्वपूर्ण है
  3. जैसा ऊपर उल्लेख किया गया है, ecb मोड का उपयोग न करें, उसके बजाय CBC उपयोग करें

यदि आप MCRYPT_RIJNDAEL_128 का उपयोग कर रहे हैं, तो rtrim($output, "\0\3") । यदि स्ट्रिंग की लंबाई 16 से कम है, तो डिक्रिप्ट फ़ंक्शन 16 अक्षरों की लंबाई के साथ एक स्ट्रिंग लौटाएगा, जो अंत में 03 जोड़ देगा।

आप इसे आसानी से देख सकते हैं, उदाहरण के लिए कोशिश कर:

 $string = "TheString"; $decrypted_string = decrypt_function($stirng, $key); echo bin2hex($decrypted_string)."=".bin2hex("TheString"); 

आप PHP में आसान और सुरक्षित एईएस एन्क्रिप्शन के लिए OpenSSL का उपयोग कर सकते हैं। OpenSSL आमतौर पर PHP में बनाया गया है, इसलिए बाह्य निर्भरता की कोई आवश्यकता नहीं है। निम्नलिखित उदाहरण:

  • सीबीसी मोड में एईएस 256 का उपयोग करता है
  • SHA256 का उपयोग कर दिए गए पासवर्ड से एक कुंजी उत्पन्न करता है
  • अखंडता जांच के लिए एन्क्रिप्टेड डेटा के एक एचएमएसी हैश उत्पन्न करता है
  • प्रत्येक संदेश के लिए एक यादृच्छिक चतुर्थ उत्पन्न करता है
  • सिफरटेक्स्ट के लिए IV (16 बाइट्स) और हैश (32 बाइट्स) का शुभारंभ करता है

IV एक सार्वजनिक जानकारी है और प्रत्येक संदेश के लिए यादृच्छिक होना चाहिए हैश यह सुनिश्चित करता है कि डेटा को छेड़छाड़ नहीं किया गया है

 function encrypt($plaintext, $password) { $method = "AES-256-CBC"; $key = hash('sha256', $password, true); $iv = openssl_random_pseudo_bytes(16); $ciphertext = openssl_encrypt($plaintext, $method, $key, OPENSSL_RAW_DATA, $iv); $hash = hash_hmac('sha256', $ciphertext, $key, true); return $iv . $hash . $ciphertext; } function decrypt($ivHashCiphertext, $password) { $method = "AES-256-CBC"; $iv = substr($ivHashCiphertext, 0, 16); $hash = substr($ivHashCiphertext, 16, 32); $ciphertext = substr($ivHashCiphertext, 48); $key = hash('sha256', $password, true); if (hash_hmac('sha256', $ciphertext, $key, true) !== $hash) return null; return openssl_decrypt($ciphertext, $method, $key, OPENSSL_RAW_DATA, $iv); } 

उपयोग:

 $encrypted = encrypt('Plaintext string.', 'password'); // this yields a binary string echo decrypt($encrypted, 'password'); // decrypt($encrypted, 'wrong password') === null 

यह अन्य एईएस कार्यान्वयन के साथ संगत होना चाहिए, लेकिन mcrypt नहीं है , क्योंकि mcrypt PKCS # 7 के बजाय पीकेसीएस # 5 का उपयोग करता है