注意:PHP 7.2+ 已棄用 mcrypt,PHP 7.3+ 完全移除。本教程適用於維護 PHP 5.3/5.6/7.0/7.1 老項目。新項目請使用 OpenSSL (openssl_encrypt) 或 libsodium (sodium_*) 替代。
/usr/local/php5)三者必須按順序安裝,後者依賴前者的庫文件和頭文件。
# 下載
wget https://sourceforge.net/projects/mcrypt/files/Libmcrypt/2.5.8/libmcrypt-2.5.8.tar.gz/download -O libmcrypt-2.5.8.tar.gz
# 解壓編譯
tar zxvf libmcrypt-2.5.8.tar.gz
cd libmcrypt-2.5.8
./configure --prefix=/usr/local/libmcrypt --enable-shared
make && make install
# 驗證
ls /usr/local/libmcrypt/lib/libmcrypt*
# 應看到 libmcrypt.so, libmcrypt.la 等
wget https://sourceforge.net/projects/mhash/files/mhash/0.9.9.9/mhash-0.9.9.9.tar.gz/download -O mhash-0.9.9.9.tar.gz
tar zxvf mhash-0.9.9.9.tar.gz
cd mhash-0.9.9.9
# 關鍵:使用 phpize 生成配置腳本,指定 php-config 路徑
/usr/local/php5/bin/phpize
./configure --with-php-config=/usr/local/php5/bin/php-config
make && make install
wget https://sourceforge.net/projects/mcrypt/files/MCrypt/2.6.8/mcrypt-2.6.8.tar.gz/download -O mcrypt-2.6.8.tar.gz
tar zxvf mcrypt-2.6.8.tar.gz
cd mcrypt-2.6.8
# 指定 libmcrypt 路徑與 php-config
/usr/local/php5/bin/phpize
./configure \
--with-php-config=/usr/local/php5/bin/php-config \
--with-mcrypt=/usr/local/libmcrypt \
--with-libmcrypt-prefix=/usr/local/libmcrypt
make && make install
編譯成功後,提示類似:
Installing shared extensions: /usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/
修改 php.ini:
extension_dir = "/usr/local/php5/lib/php/extensions/no-debug-non-zts-20090626/"
extension = mcrypt.so
重啟 Apache/PHP-FPM:
service httpd restart
# 或
/usr/local/php5/sbin/php-fpm restart
/usr/local/php5/bin/php -m | grep mcrypt
# 輸出: mcrypt
/usr/local/php5/bin/php -i | grep "mcrypt support"
# mcrypt support => enabled
# mcrypt_filter support => enabled
# Version => 2.5.8
# Api No => 20021217
| 錯誤 | 原因 | 解決 |
|---|---|---|
| configure: error: mcrypt.h not found | libmcrypt 未安裝或路徑錯誤 | 安裝 libmcrypt,指定 --with-libmcrypt-prefix |
| phpize: command not found | 未安裝 php-devel / php5-dev | yum install php-devel / apt install php5-dev |
| mcrypt.so: undefined symbol | 庫版本不匹配 / 多版本衝突 | 檢查 ldd mcrypt.so,確保鏈接正確 libmcrypt |
| 編譯通過但 php -m 無 mcrypt | extension_dir 錯誤 / 未重啟服務 | 核對 php.ini extension_dir,重啟 PHP |
<?php
// 1. OpenSSL AES-256-CBC (PHP 5.3+ 內置)
function encryptOpenSSL($data, $key, $iv) {
return openssl_encrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
}
function decryptOpenSSL($data, $key, $iv) {
return openssl_decrypt($data, 'AES-256-CBC', $key, OPENSSL_RAW_DATA, $iv);
}
// 2. Sodium (PHP 7.2+ 內置,更安全、更簡單)
function encryptSodium($data, $key) {
$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = sodium_crypto_secretbox($data, $nonce, $key);
return $nonce . $cipher; // 存儲時拼接 nonce
}
function decryptSodium($data, $key) {
$nonce = substr($data, 0, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
$cipher = substr($data, SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
return sodium_crypto_secretbox_open($cipher, $nonce, $key);
}
?>
本文記錄了 CentOS 6.3 下 PHP 5.3 手動編譯安裝 mcrypt 的完整步驟與坑點。對於現存老項目可參考操作;新項目務必使用 OpenSSL 或 Sodium,獲得原生支持、更好性能、無依賴地獄、長期安全維護。