mcrypt_module_open()警告!

时间:2011-03-20 07:47:03

标签: php mamp

我在Mac OSX上使用Mamp服务器。我正在尝试在我的项目中实现客户端cookie的加密。我正在收到警告

  

警告:mcrypt_module_open()[function.mcrypt-module-open]:无法打开加密模块

我检查了php.ini文件,并且mcrypt扩展名前面没有分号。有人可以帮助解决这个问题。

提前致谢

5 个答案:

答案 0 :(得分:5)

你的php.ini中启用了mcrypt模块,否则你会收到Call to undefined function行的错误信息。

它表示所请求的密码方法不可用。您有一个拼写错误,或者其中一个密码未编译到您的mcrypt.so版本中。

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

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

manual page和额外参数表明系统上的libmcrypt可能依赖于共享模块本身。所以你可能想要搜索另一个版本。尝试更新MAMP,或使用该PHP发行版存在的专业版。

答案 1 :(得分:2)

我也在使用George Schlassnagles“高级PHP编程”(第334页)中的这个示例。此代码包含一些错误。当你引用一个静态变量时,我认为你必须用self :: $ var。

来调用它

这个应该有效:

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

请注意,还有一些错误,例如:

    validate()函数中的
  • self :: $ resettime显然应该命名为self :: $ warning。
  • 函数中的
  • static $ key _encrypt()和_decrypt()应为self :: $ key
  • _liage()中的
  • $ glue和_unpackage函数应该是self :: $ glue
  • 函数_reissue()从不使用
  • 函数_encrypt()中的
  • $ td应为$ this-> td
  • 函数set()和logout()中的
  • set_cookie应命名为setcookie并提供路径'/'(第4个参数)以在整个网站上使用cookie(否则,如果你在/ login / facebook上设置cookie)你无法访问/仪表板)
  • $ ivsize = mcrypt_get_iv_size($ this-> td);在_decrypt()中应该是$ivsize = mcrypt_get_iv_size(self::$cypher, self::$mode);

答案 2 :(得分:0)

我在CFB模式下使用blowfish算法。

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

我用来调用算法的命令是

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

我会尝试使用其他算法并检查是否有效。

答案 3 :(得分:0)

@mario:谢谢你的回复。这是我加密的代码。

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

答案 4 :(得分:0)

如果您的libmcrypt配置了“--disable-dynamic-loading”标志,则会出现此问题,因为mcrypt没有可用的算法。

重新编译没有该标志的libmcrypt,它将起作用。您甚至不必重建PHP或ext / mcrypt模块。

我遇到了这个问题(PHP 5.5 Solaris10 / Sparc)