2012-06-06 5 views
11

मुझे अपने सिफर वर्ग के साथ कोई समस्या है। कभी-कभी यह बहुत तेज़ होता है। कभी-कभी हालांकि यह धीमा है। कोड का उपयोग कर इम रूपसिफर वर्ग और mcrypt_create_iv समय पर धीमा है

class Cipher { 
    private $securekey, $iv; 
    function __construct() { 
     $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/[email protected]',TRUE); 
     $this->iv = mcrypt_create_iv(32); 
    } 
    function encrypt($input) { 
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB)); 
    } 
    function decrypt($input) { 
     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB)); 
    } 
    function storeIV() { 
     return $this->iv; 
    } 
} 

इस प्रकार है वहाँ क्यों इस समय धीमा हो सकता है पर किसी भी सुझाव हैं और मैं इसे ठीक कर सकते हैं? MCRYPT_RAND (सिस्टम यादृच्छिक संख्या जनरेटर), MCRYPT_DEV_RANDOM और MCRYPT_DEV_URANDOM (पढ़ने/dev/यादृच्छिक से डेटा) (/ dev/urandom से डेटा पढ़ने):

+0

सर्वर लोड लोड होने पर क्या होता है? जब यह धीमा चलता है? आपने किस प्रकार के रिकॉर्ड दर्ज किए हैं? – Crontab

+0

सर्वर लोड तेजी से/धीमी गति के बीच समान होते हैं जब यह तेज़ होता है तो यह लगभग 5 सेकंड में धीमा होने पर लोड हो रहा है, मैं लगभग 2 मिनट तक प्रतीक्षा कर सकता हूं – bretterer

+0

बस एक सुरक्षा नोट: मेरा मानना ​​है कि आप एन्क्रिप्ट करने के लिए अपने सिफर क्लास का उपयोग कर रहे हैं एकाधिक सादा पाठ। आम तौर पर एक iv का पुन: उपयोग नहीं किया जाना चाहिए, इसलिए बेहतर है कि मैं चौथाई को एन्क्रिप्ट विधि में कन्स्ट्रक्टर में उत्पन्न करना चाहता हूं। Http://stackoverflow.com/questions/11821195/use-of-initialization-vector-in-openssl-encrypt देखें कि इसे स्टोर और पुनर्स्थापित कैसे करें। साथ ही, ध्यान दें कि अगर सिस्टम में पर्याप्त एन्ट्रॉपी नहीं है तो mcrypt_create_iv बहुत धीमा हो सकता है। व्यक्तिगत रूप से मैं openssl_random_pseudo_bytes का उपयोग करता हूं। साथ ही, मुझे लगता है कि आपके mcrypt_encrypt/decrypt फ़ंक्शन कॉल में iv तर्क अनुपलब्ध है। –

उत्तर

26

आप mcrypt_create_iv() के लिए तीन अलग-अलग दूसरा तर्क की कोशिश की? क्या वे अलग-अलग गति की पेशकश करते हैं? मुझे आश्चर्य है कि ऐसा इसलिए है क्योंकि/dev/random (डिफ़ॉल्ट यादृच्छिक स्रोत) एकत्रित एन्ट्रॉपी से बाहर चल रहा है; जब यह करता है तो फ़ंक्शन ब्लॉक हो जाएगा।

+0

यदि यह उत्तरार्द्ध है, तो इसके लिए कोई समाधान है या क्या हमें बस 'MCRYPT_DEV_URANDOM' में बदलना चाहिए? – Dan

+2

@ Silver89: बस 'MCRYPT_DEV_URANDOM' में बदलें। ब्रूस श्नीयर के मुताबिक, न तो/dev/random और न ही/dev/urandom बहुत मजबूत हैं (https://www.schneier.com/blog/archives/2013/10/insecurities_in.html), तो आप एक का भी उपयोग कर सकते हैं यह काम करता है। – Crontab

+0

मैंने 'MCRYPT_RAND' का उपयोग किया जो काम करता था। 'MCRYPT_DEV_URANDOM' ने भी काम किया। –

-1
class Cipher { 
    private $securekey, $iv; 
    function __construct() { 
     $this->securekey = hash('sha256','51(^8k"12cJ[6&cvo3H/[email protected]',TRUE); 
     $this->iv = isset($_SESSION['sifrem'])?$_SESSION['sifrem']:mcrypt_create_iv(34); 
     $_SESSION['sifrem']=$this->iv; 
    } 
    function encrypt($input) { 
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, $this->securekey, $input, MCRYPT_MODE_ECB)); 
    } 
    function decrypt($input) { 
     return trim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, $this->securekey, base64_decode($input), MCRYPT_MODE_ECB)); 
    } 
    function storeIV() { 
     return $this->iv; 
    } 
} 
+0

आपने क्या बदल दिया? – Nightfirecat

+1

चतुर्थ पुन: उपयोग करना कभी अच्छा विचार नहीं है, इसका नकारात्मक प्रभाव होगा कि यह कितना सुरक्षित है। – Sam

6

IV बनाने के दौरान MCRYPT_DEV_URANDOM का उपयोग करें। यह कम सुरक्षित है, लेकिन अगर एंटोपी बहुत कम हो जाता है तो ब्लॉक नहीं होगा। MCRYPT_DEV_RANDOM तब तक प्रतीक्षा करेगा जब तक कि पर्याप्त एन्ट्रॉपी सुरक्षित न हो।

// PHP < 5.6 
$this->iv = mcrypt_create_iv(32, MCRYPT_DEV_URANDOM); 

लेकिन PHP के अधिक अद्यतन संस्करणों में, डिफ़ॉल्ट बदल गया है और आपका मूल कोड काम करना चाहिए।

// PHP >= 5.6 
$this->iv = mcrypt_create_iv(32); // MCRYPT_DEV_URANDOM implied 

PHP docs: mcrypt_create_iv($ स्रोत पैरामीटर पर टिप्पणी):

ध्यान दें कि इस पैरामीटर का डिफ़ॉल्ट मान MCRYPT_DEV_RANDOM 5.6.0 PHP से पहले थी।

और Ubuntu Manual से:

आप के बारे में है कि क्या आप का उपयोग करना चाहिए/dev/यादृच्छिक या/dev/urandom अनिश्चित हैं, तो शायद आप बाद में उपयोग करना चाहते। एक सामान्य नियम के रूप में,/dev/urandom का उपयोग लंबे समय तक जीपीजी/एसएसएल/एसएसएच कुंजी को छोड़कर सबकुछ के लिए किया जाना चाहिए।

+1

यह भावना [उबंटू मैनुअल] (http://manpages.ubuntu.com/manpages/lucid/man4/random.4.html) में प्रतिबिंबित और विस्तारित है - और मैं उद्धृत करता हूं: "यदि आप इस बारे में अनिश्चित हैं कि आप/dev/random// dev/urandom का उपयोग करना चाहिए, तो शायद आप बाद वाले का उपयोग करना चाहते हैं। सामान्य नियम के रूप में,/dev/urandom का उपयोग लंबे समय तक जीपीजी/एसएसएल/एसएसएच कुंजी को छोड़कर सबकुछ के लिए किया जाना चाहिए। " –

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