Предупреждение mcrypt_module_open ()! - PullRequest
2 голосов
/ 20 марта 2011

Я использую сервер Mamp на Mac OSX.Я пытаюсь реализовать криптографию в моем проекте для файлов cookie на стороне клиента.Я получаю предупреждение

Предупреждение: mcrypt_module_open () [function.mcrypt-module-open]: не удалось открыть модуль шифрования

Я проверил в файле php.iniи нет точки с запятой перед расширением mcrypt.Может кто-нибудь помочь с этим вопросом.

Заранее спасибо

Ответы [ 5 ]

5 голосов
/ 20 марта 2011

Модуль mcrypt включен в вашем php.ini, в противном случае вы получите сообщение об ошибке в виде строк Call to undefined function.

Это означает, что запрошенный метод шифрования недоступен.У вас либо опечатка, либо один из шифров не скомпилирован в вашу версию mcrypt.so.

 mcrypt_module_open('rijndael-256', '', 'ofb', '');   // works

 mcrypt_module_open('wrong', '', '', '');   // generates your error

Страница руководства , а дополнительные параметры указывают, что libmcrypt на вашемСистема может зависеть от общих модулей.Так что вы можете искать другую версию.Попробуйте обновление MAMP или используйте профессиональную версию, которая существует для этого дистрибутива PHP.

2 голосов
/ 31 октября 2012

Я также использую этот пример из книги Джорджа Шласснаглса «Расширенное программирование на PHP» (стр. 334ff). Этот код содержит некоторые ошибки. Поскольку вы ссылаетесь на статическую переменную, я думаю, что вы должны вызывать ее с помощью self :: $ var.

Этот должен работать:

mcrypt_module_open(self::$cipher, '', self::$mode, '');

Обратите внимание, что есть еще несколько ошибок, таких как:

  • self :: $ resettime в функции validate (), очевидно, должно называться self :: $ warning.
  • static $ key в функциях _encrypt () и _decrypt () должно быть self :: $ key
  • $ glue в функциях _package () и _unpackage должна быть self :: $ glue
  • функция _reissue () никогда не используется
  • $ td в функции _encrypt () должно быть $ this-> td
  • set_cookie в функциях set () и logout () должен называться setcookie и иметь путь '/' (4-й параметр) для использования cookie на всем вашем веб-сайте (в противном случае, если вы установили cookie, например, на / login / facebook Вы не можете получить доступ в / приборной панели)
  • $ ivsize = mcrypt_get_iv_size ($ this-> td); в _decrypt () должно быть $ivsize = mcrypt_get_iv_size(self::$cypher, self::$mode);
0 голосов
/ 06 августа 2013

Если ваш libmcrypt был настроен с флагом «--disable-dynamic-loading», это приведет к проблеме, так как не будет доступных алгоритмов для mcrypt.

Перекомпилируйте libmcrypt без этого флага, и он будет работать,Вам даже не нужно перестраивать PHP или модуль ext / mcrypt.

У меня была именно эта проблема (PHP 5.5 Solaris10 / Sparc)

0 голосов
/ 25 марта 2011

@ Марио: Спасибо за ответ.Это код, который у меня есть для шифрования.

class Cookie {
    private $created;
    private $userid;
    private $version;
    // mcrypt handle
    private $td;

    // mcrypt information
    static $cipher = 'rijndael-256';
    static $mode = 'ofb';
    static $key = '$pxaWyXY67UIq*i&mNlFswBzyJkL7#1N';

    // Cookie format information
    static $cookiename = 'USERAUTH';
    static $myversion = '1';
    // When the cookie expires
    static $expiration = '600';
    // When to reissue the cookie
    static $warning = '300';
    static $glue = '|';

    public function __construct($userid = false) {
        $this->td = mcrypt_module_open($cipher, '', $mode, '');
        if($this->userid) {
            $this->userid = $userid;
        } else {
            if(array_key_exists(self::$cookiename, $_COOKIE)) {
                $buffer = $this->_unpackage($_COOKIE[self::$cookiename]);   
            } else {
                throw new AuthException("No Cookie");   
            }
        }
    }

public function _encrypt($plaintext) {
        //$td = mcrypt_module_open (self::$cipher, '', self::$mode, '');
        $iv = mcrypt_create_iv (mcrypt_enc_get_iv_size ($td), MYCRYPT_RAND);
        mcrypt_generic_init ($td, $plaintext);
        $crypttext = mcrypt_generic($td, $plaintext);
        mcrypt_generic_deinit ($td);
        return $iv.$crypttext;  
    }

    public function _decrypt($crypttext) {
        //$td = mcrypt_module_open (self::$cipher, '', self::$mode, '');
        $ivsize = mcrypt_enc_get_iv_size ($td);
        $iv = substr ($crypt, 0, $ivsize);
        $crypttext = substr ($crypttext, $ivsize);
        $plaintext = "";
        if($iv) {
            mcrypt_generic_init($td, self::$key, $iv);
            $plaintext = mdecrypt_generic($td, $crypttext);
            mcrypt_generic_deinit ($td);    
        }
        return $plaintext;
    }
0 голосов
/ 20 марта 2011

Я использую алгоритм blowfish в режиме CFB.

static $cipher = 'blowfish';    
static $mode = 'cfb';
static $key = '$pxaWyXY67UIq*i&mNlFswBzyJkL7#1N';

и команда, которую я использовал для вызова алгоритма:

mcrypt_module_open($cipher, '', $mode, '');

Я бы попробовал другой алгоритм и проверил,один работает.

...