mcrypt安装问题
Posted
技术标签:
【中文标题】mcrypt安装问题【英文标题】:problem with mcrypt installation 【发布时间】:2011-06-16 03:03:44 【问题描述】:我已经要求系统管理员在服务器上安装 mcrypt,他们说一切正常。但是当我运行我的简单脚本时,我得到了这个。
警告:mcrypt_get_iv_size() [function.mcrypt-get-iv-size]:模块初始化失败
它来自这条线:
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_256,MCRYPT_MODE_ECB);
现在,从这段代码:
$algorithms = mcrypt_list_algorithms("/usr/local/bin/mcrypt");
foreach ($algorithms as $cipher)
echo "$cipher<br />\n";
我明白了:
警告:mcrypt_list_algorithms() [function.mcrypt-list-algorithms]:在模块目录中找不到算法
当我运行这个时:
$modes = mcrypt_list_modes("/usr/local/bin/mcrypt");
foreach ($modes as $mode)
echo "$mode <br />\n";
我明白了:
警告:mcrypt_list_modes() [function.mcrypt-list-modes]:在模块目录中找不到模式
但是,运行这个命令这个命令
which mcrypt; mcrypt -v
生产:
/usr/local/bin/mcrypt
Mcrypt v.0.9.9 (x86_64-unknown-linux-gnu)
Linked against libmcrypt v.2.5.7
Copyright (C) 1998-2002 Nikos Mavroyanopoulos (nmav@gnutls.org)
mcrypt 是否安装/配置正确?
更新:
我这样做了:
whereis libmcrypt
...得到了结果:
libmcrypt: /usr/local/lib/libmcrypt /usr/local/lib/libmcrypt.so /usr/local/lib/libmcrypt.la
我也变了:
$modes = mcrypt_list_modes("/usr/local/bin/mcrypt");
到...
$modes = mcrypt_list_modes("/usr/local/lib/libmcrypt");
$algorithms = mcrypt_list_algorithms("/usr/local/lib/libmcrypt");
按照建议,但仍然出现错误:
警告:mcrypt_list_modes() [function.mcrypt-list-modes]:在模块目录中找不到模式
然后我进入我的 CPanel 中的文件管理器到/usr/local/lib/libmcrypt
。目录存在,但里面没有文件...
Here is the print screen of the file manager.
谢谢。
【问题讨论】:
cypher 和 mode 都是常量而不是字符串,如果将其视为字符串,则会收到警告,尝试像常量一样调用它并且会起作用。例如。 echo "$cipher\n";与 echo MCRYPT_TWOFISH 不一样;常量模式相同 -> echo MCRYPT_MODE_ECB;和 echo "$mode" 不一样; 【参考方案1】:试试这个解决你的 mcrypt 问题:
mv -i /etc/php5/conf.d/mcrypt.ini /etc/php5/mods-available/
sudo php5enmod mcrypt
sudo service apache2 restart
这是 mcrypt.ini 文件位置的错误。
我有同样的错误,我做了一个 cp 而不是 mv 确定,但它解决了问题。
对于 PHP 不工作,如果你让 phpmyadmin 工作(即使有 mcrypt 错误),这意味着 PHP 工作(因为 phpmyadmin 使用 PHP)。但在你的例子中
<? echo $row['details']; ?>
将<?
更改为<?php
并重试?
【讨论】:
这正是我的问题。对我来说似乎是一个错误。这应该在安装 php5-mcrypt 或类似工具时自动完成。【参考方案2】:在 Ubuntu 14.04 上只需要像 sudo 一样执行三个步骤:
apt-get install php5-mcrypt
php5enmod mcrypt
service apache2 restart
【讨论】:
【参考方案3】:mcrypt 算法目录必须是包含算法的目录,而不是二进制文件。这意味着:
$modes = mcrypt_list_modes("/usr/local/bin/mcrypt");
应该是这个(假设 mcrypt 安装的是/usr/local/lib/libmcrypt
):
$modes = mcrypt_list_modes("/usr/local/lib/libmcrypt");
如果libmcrypt
的安装目录不是上面那个目录,你必须更新你的php.ini 设置。取自 php.ini:
[mcrypt]
; Directory where to load mcrypt algorithms
; Default: Compiled in into libmcrypt (usually /usr/local/lib/libmcrypt)
;mcrypt.algorithms_dir=
; Directory where to load mcrypt modes
; Default: Compiled in into libmcrypt (usually /usr/local/lib/libmcrypt)
;mcrypt.modes_dir=
如果你有 shell 访问权限,你可以试试这个命令来找到你的 mcrypt 安装的 lib 目录:
whereis libmcrypt
或者...
whereis mcrypt
取决于您的设置。
【讨论】:
netcoder 我将回复作为答案发布,因为这是我可以拥有样式的唯一方法......并且消息对于回复字段来说太长了?为此,我深表歉意。 @user591267:mcrypt --list-hash
在命令行中返回什么?
它返回:支持散列算法:CRC32 MD5 SHA1 Haval256 RIPEMD160 Tiger GOST CRC32B Haval224 Haval122 Haval160 HavaL128 Tiger128 Tiger160 MD4 SHA256 AdleMD256 RIPEMD320 SNEFRU128 SNEFRU256 MD2 SPEN>
【参考方案4】:
我遇到了完全相同的问题。
> mcrypt -v
Mcrypt v.0.9.9 (sparc-sun-solaris2.10)
Linked against libmcrypt v.2.5.8
> mcrypt --list-hash
Supported Hash Algorithms:
crc32
md5
sha1
haval256
ripemd160
tiger
gost
[...]
> php CryptoTest.php
PHP Warning: mcrypt_list_modes(): No modes found in module dir in [...]
通过使用这些选项重新配置和重新编译 libmcrypt 解决了这个问题:
./configure --prefix=$YOUR_PATH/libmcrypt --enable-dynamic-loading --disable-posix-threads
然后在你的 php.ini 中:
mcrypt.algorithms_dir=<YOUR_PATH>/libmcrypt/lib/libmcrypt
mcrypt.modes_dir=<YOUR_PATH>/libmcrypt/lib/libmcrypt
【讨论】:
【参考方案5】:如何在 MAC OSX 上安装 mcrypt:
您好,已在 Mac OSX El Capitan 上测试并运行:
1。下载mcrypt:http://www.viames.it/download/elcapitan/mcrypt.so
2。把它放在:
/usr/lib/php/extensions/mcrypt
3。修改你的'php.ini'
/etc/php.ini
并添加以下行:
extension = /usr/lib/php/extensions/mcrypt.so
4。检查是否使用以下命令加载了“mcrypt”:
php -m
php -m console result
5。创建一个包含内容的“phpinfo.php”:
<?php echo phpinfo(); ?>
并查看是否列出了 mcrypt:
phpinfo() shows now mcrypt to be loaded
是的,我知道我是黑帮。
【讨论】:
最好不要使用mcrypt,它是废弃软件,多年未更新,不支持标准PKCS#7(née PKCS#5)填充,只有非标准空填充可以'甚至不能与二进制数据一起使用。 mcrypt 有许多出色的 bugs 可以追溯到 2003 年。请考虑使用 defuse 或 RNCryptor,它们提供了完整的解决方案并且正在维护并且是正确的。 是的,同意。然而,我写这篇文章的原因是因为我必须处理一个需要“mcrypt”的遗留项目,所以基本上我想省去其他人在这种特定情况下的麻烦。【参考方案6】:架构:Centos 6 / Apache 2.2 / 双 PHP 安装(5.3 和 5.4)
更新:这个解决方案解释了如何在 Centos 6 上从 Remi 的 RPM 手动安装模块 mcrypt 和 PHP 5.4,但是这个 RPM 需要 glibc-2.14+,所以如果你的 glibc 较旧,这还不足以使它工作比那个。
在我的配置中,Yum install php-mcrypt*
显示为在普通根目录下安装了5.3
的版本:
php-mcrypt.x86_64 5.3.3-5.el6 @epel
但是,5.4 被 chroot 到 /opt/rh/php54
仅复制 5.3 模块和配置文件是行不通的。模块初始化失败,所以它没有出现在 phpinfo() 中,这个可以检查
/opt/rh/php54/root/usr/bin/php -v
对我有用的解决方案是下载 Remi 的 RPM(尽管通过添加他的 Yum 存储库通常更容易安装它,如评论中所述)(https://www.rpmfind.net/linux/RPM/remi/fedora/25/x86_64/php54-php-mcrypt-5.4.45-12.fc25.remi.x86_64.html)
wget ftp://fr2.rpmfind.net/linux/remi/fedora/25/remi/x86_64/php54-php-mcrypt-5.4.45-12.fc25.remi.x86_64.rpm
使用 RPM2CPIO 解压文件:
rpm2cpio php54-php-mcrypt-5.4.45-12.fc25.remi.x86_64.rpm |cpio -idmv
./opt/remi/php54/root/etc/php.d/mcrypt.ini
./opt/remi/php54/root/usr/lib64/php/modules/mcrypt.so
98 blocks
并复制到chroot文件夹
cp ./opt/remi/php54/root/etc/php.d/mcrypt.ini /opt/rh/php54/root/etc/php.d/mcrypt.ini
cp ./opt/remi/php54/root/usr/lib64/php/modules/mcrypt.so /opt/rh/php54/root/usr/lib64/php/modules/
检查:
/opt/rh/php54/root/usr/bin/php -v
还有:
<html>
<body>
<?php
phpinfo();
?>
</body>
</html>
【讨论】:
如果您使用来自 RHSCL(或 centos-scl)的 php54,简单的方法是使用 php54more 存储库,请参阅:softwarecollections.org/en/scls/remi/php54more。 BTW PHP 5.4 已停产,而 mcrypt 是一个巨大的陷阱,请参阅:blog.remirepo.net/post/2015/07/07/… 感谢 cmets,不幸的是,mcrypt 是 RedSys 所需的库,RedSys 是西班牙领先的在线支付网关,前身为 Sermepa,并被领先银行(Santander、BBVA、Caixa)的客户使用) 所以这不是我的选择。关于不使用 php54more 存储库,这是出于安全考虑。出于商业目的,很难证明在二进制源中使用是合理的,这是一个私人维护的存储库(无论如何为社区提供的出色服务欢呼!)所以我想知道我什么时候走这条路。 “php54more”和“remi”存储库都是社区存储库,并且是相同的维护者;)以上是关于mcrypt安装问题的主要内容,如果未能解决你的问题,请参考以下文章
在 Mavericks (10.9) 上安装 mcrypt 库时遇到问题