Переглянути джерело

ZF-8742
- stronger random number generation support added where applicable to Zend_Filter_Encrypt_Mcrypt

git-svn-id: http://framework.zend.com/svn/framework/standard/trunk@20132 44c647ce-9c0f-0410-b52a-842ac1e357ba

ralph 16 роки тому
батько
коміт
838b364ce0
1 змінених файлів з 33 додано та 3 видалено
  1. 33 3
      library/Zend/Filter/Encrypt/Mcrypt.php

+ 33 - 3
library/Zend/Filter/Encrypt/Mcrypt.php

@@ -54,6 +54,8 @@ class Zend_Filter_Encrypt_Mcrypt implements Zend_Filter_Encrypt_Interface
         'salt'                => false
     );
 
+    protected static $_srandCalled = false;
+    
     /**
      * Class constructor
      *
@@ -154,8 +156,19 @@ class Zend_Filter_Encrypt_Mcrypt implements Zend_Filter_Encrypt_Interface
         $cipher = $this->_openCipher();
         $size   = mcrypt_enc_get_iv_size($cipher);
         if (empty($vector)) {
-            srand();
-            $vector = mcrypt_create_iv($size, MCRYPT_RAND);
+            $this->_srand();
+            if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' && version_compare(PHP_VERSION, '5.3.0', '<')) {
+                $method = MCRYPT_RAND;
+            } else {
+                if (file_exists('/dev/urandom') || (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN')) {
+                    $method = MCRYPT_DEV_URANDOM;
+                } elseif (file_exists('/dev/random')) {
+                    $method = MCRYPT_DEV_RANDOM;
+                } else {
+                    $method = MCRYPT_RAND;
+                }
+            }
+            $vector = mcrypt_create_iv($size, $method);
         } else if (strlen($vector) != $size) {
             require_once 'Zend/Filter/Exception.php';
             throw new Zend_Filter_Exception('The given vector has a wrong size for the set algorithm');
@@ -263,7 +276,7 @@ class Zend_Filter_Encrypt_Mcrypt implements Zend_Filter_Encrypt_Interface
 
         $keysizes = mcrypt_enc_get_supported_key_sizes($cipher);
         if (empty($keysizes) || ($this->_encryption['salt'] == true)) {
-            srand();
+            $this->_srand();
             $keysize = mcrypt_enc_get_key_size($cipher);
             $key     = substr(md5($key), 0, $keysize);
         } else if (!in_array(strlen($key), $keysizes)) {
@@ -279,4 +292,21 @@ class Zend_Filter_Encrypt_Mcrypt implements Zend_Filter_Encrypt_Interface
 
         return $this;
     }
+    
+    /**
+     * _srand() interception
+     * 
+     * @see ZF-8742
+     */
+    protected function _srand()
+    {
+        if (version_compare(PHP_VERSION, '5.3.0', '>=')) {
+            return;
+        }
+        
+        if (!self::$_srandCalled) {
+            srand((double) microtime() * 1000000);
+            self::$_srandCalled = true;
+        }
+    }
 }