2015-09-08 6 views
7

पर PHP 5.6 में काम नहीं करता है मैं जीत/आईआईएस और लिनक्स दोनों पर वर्षों से अपने PHP ऐप में मैक्रिप्ट का भारी उपयोग कर रहा हूं। हालांकि मैं अपने लिनक्स सर्वर पर PHP 5.4.28 चला रहा हूं, फिर भी मैंने अपने विंडोज 8.1 आईआईएस बॉक्स पर PHP 5.6.11 में अपग्रेड किया है। और mcrypt अब काम नहीं करता है। यह किसी भी त्रुटि को फेंक नहीं देता है जिसे मैं देख सकता हूं; यह सिर्फ काम नहीं करता है।mcrypt विंडोज 5.6/आईआईएस

function Encrypt($text){ 
    global $salt; 
    if($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)))); 
    else 
     return ""; 
} 

यह मेरा linux सर्वर पर ठीक काम करता है, लेकिन मेरे स्थानीय खिड़कियों बॉक्स पर खाली रिटर्न: यहाँ मेरी एन्क्रिप्शन कार्य है। मैंने जो पढ़ा है, उससे मैक्रिप्ट विंडोज़ के लिए PHP 5.6 में बनाया गया है, इसलिए एक्सटेंशन या आईएनआई फ़ाइल के साथ कोई झुकाव नहीं होना चाहिए।

मुझे क्या याद आ रही है?

+0

क्या '/ dev/urandom' का उपयोग नहीं किया गया है? – ScottMcGready

+0

विंडोज 8 पर PHP 5.6.12 के साथ परीक्षण किया गया और यह काम करता है ... यह आपके '$ टेक्स्ट' के रूप में उतना आसान नहीं हो सकता है? 'var_dump ($ text)' करने का प्रयास किया है? –

+0

मुझे आशा है कि आपको एहसास होगा कि 'एन्क्रिप्टेड' फ़ंक्शन कितना असुरक्षित है। –

उत्तर

5

PHP 5.6 में 5.4 से अधिक मजबूत एन्क्रिप्शन आवश्यकताएं हैं।

चेतावनी:: 5.6 में आपको यह चेतावनी है, जो वास्तव में एक त्रुटि है, क्योंकि यह वास्तव में encryptions और decryptions विफल करने का कारण बनता मिलेगा mcrypt_encrypt(): आकार की मुख्य इस एल्गोरिथ्म द्वारा समर्थित नहीं XX। आकार 16, 24 या 32 के केवल चाबियाँ समर्थित हैं।

... जहां "xx" आपके नमक मूल्य की लंबाई है। तो नमक मूल्य लंबाई 16, 24, या 32 वर्णों में होना चाहिए।

3

मेरे पास कोई जवाब नहीं है, लेकिन यह एक टिप्पणी के लिए काफी लंबा है।

यह किसी भी त्रुटि है कि मैं देख सकता हूँ

आप सत्यापित करें कि आप आप त्रुटियों को देख सकते हैं जब वे होते हैं आपके विन्यास का परीक्षण किया है फेंक नहीं है?

लेकिन खाली रिटर्न पर अपने स्थानीय खिड़कियों बॉक्स

यह तो यह घातक त्रुटि पैदा नहीं कर रहा है लौटा रहा है तो। इसलिए mcrypt कार्यों को परिभाषित किया जाता है। क्या आपने जांच की है कि स्थिरांक परिभाषित किए गए हैं? क्या आपने जांच की है कि libmcrypt का संस्करण PHP एक्सटेंशन आवश्यकता से मेल खाता है?

क्या आपने जांच की है कि mcrypt _ *() फ़ंक्शंस में इनपुट समझदार दिखते हैं?

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)))); 

यहां तक ​​कि अगर उपर्युक्त काम करता है, तो यह कोड का एक भयानक बिट है। breakpoints

$iv=mcrypt_create_iv(mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB); 
$encypted=mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $salt, $text, MCRYPT_MODE_ECB 
       , $iv, MCRYPT_RAND); 
$encoded=base64_encode($encrypted); 
return $encoded; 

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

+0

"कोड लिखने और उच्च स्तरीय भाषाओं का उपयोग करने का कारण यह नहीं है कि आपका कंप्यूटर उन्हें समझ सके लेकिन मनुष्य मनुष्य कोड को समझ सकते हैं" == दिन का उद्धरण। – sitilge

8

चलिए टुकड़े से अपना कोड टुकड़ा देखें। (ज्यादातर कॉस्मेटिक/खाली स्थान के परिवर्तन के साथ।)

function Encrypt($text) 
{ 
    global $salt; // Why not make this a second parameter? 
    if($text != "") { // An unusual check, for sure 
     return trim(// base64_encode doesn't leave whitespace 
      base64_encode(
       mcrypt_encrypt(
        MCRYPT_RIJNDAEL_256, // This is a non-standard variant of the 
             // Rijndael cipher. You want to use the 
             // MCRYPT_RIJNDAEL_128 constant if you 
             // wanted to use AES here. 
        $salt, // This is a key, not a salt! 
        $text, 
        MCRYPT_MODE_ECB, // ECB mode is the worst mode to use for 
            // cryptography. Among other reasons, it 
            // doesn't even use the IV. Search for 
            // ECB penguins for an idea of why ECB 
            // mode is such a bad idea. 
        mcrypt_create_iv(
         mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256, MCRYPT_MODE_ECB), 
         MCRYPT_RAND // You're using ECB mode so this is a waste 
            // anyway, but you should use 
            // MCRYPT_DEV_URANDOM instead of MCRYPT_RAND 
        ) 
       ) 
      ) 
     ); 
    } 
    return ""; 
} 

मैं दृढ़ता से सुझाव है कि आप कुछ भी करने के लिए इस सुविधा का उपयोग नहीं करते। यह सुरक्षित नहीं है। Don't use ECB mode

इसके अलावा, unauthenticated encryption is dangerous और libmcrypt is abandonware

+0

स्कॉट, यदि आप मुझे अपनी सभी सिफारिशों के अनुसार एक कामकाजी उदाहरण दे सकते हैं, तो यदि आप इसकी परवाह करते हैं तो मैं आपको बक्षीस दूंगा। – HerrimanCoder

+0

हाँ, यह आसान है। अपना खुद का लिखने के बजाय [defuse/php-encption] (https://github.com/defuse/php-encryption) का उपयोग करें। –

+0

हमम ... encr libs का उपयोग कर w/php बिल्कुल अपना खुद का लेखन नहीं कर रहा है। इसके अलावा मेरा वेबपैप बैंकिंग या राष्ट्रीय सुरक्षा नहीं है ... सिर्फ खेल शेड्यूल अपने शेड्यूल की जांच कर रहा है। – HerrimanCoder

0

SweatCoder जैसा कि पहले कहा गया है, MCRYPT_RIJNDAEL_256 के लिए अपने प्रमुख 32. की लंबाई के साथ काम जारी रखने के लिए के लिए है अपने पुराने कुंजी ($ oldkey यहाँ कहा जाता है) किया जा रहा से छोटी 32 का उपयोग

$key = str_pad($oldkey, 32, chr(0)); 

($ कुंजी है जिसे आपने $ नमक कहा)