我在Mac OSX上使用Mamp服务器。我正在尝试在我的项目中实现客户端cookie的加密。我正在收到警告
警告:mcrypt_module_open()[function.mcrypt-module-open]:无法打开加密模块
我检查了php.ini文件,并且mcrypt扩展名前面没有分号。有人可以帮助解决这个问题。
提前致谢
答案 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, '');
请注意,还有一些错误,例如:
$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)