“PHP7.1中使用openssl替换mcrypt的实例详解”
背景
PHP 7.1 中,mcrypt 扩展已经被废弃,官方推荐使用 openssl 扩展替代,本文将详细讲解如何在 PHP 7.1 中使用 openssl 扩展替换 mcrypt 扩展。
准备工作
在开始之前,需要确认 PHP 版本是否为 7.1 及以上,以及是否安装了 openssl 扩展。可以通过在终端执行 php -v
和在 php 文件中使用 extension_loaded('openssl')
来确认。
mcrypt 与 openssl 的区别
以 AES 128 ECB 模式加密为例,区别如下:
mcrypt
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
$key = "your_key_here";
$text = "your_text_here";
$encrypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB, $iv);
$base64_encrypted_text = base64_encode($encrypted_text);
openssl
$key = "your_key_here";
$text = "your_text_here";
$encrypted_text = openssl_encrypt($text, "AES-128-ECB", $key);
$base64_encrypted_text = base64_encode($encrypted_text);
详细步骤
- 确认 PHP 版本是否为 7.1 及以上,以及是否安装了 openssl 扩展。
- 替换 mcrypt_create_iv() 函数。
将 mcrypt_create_iv($size, $source)
替换为 openssl_random_pseudo_bytes($size)
。
```php
// mcrypt_create_iv
$iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$iv = mcrypt_create_iv($iv_size, MCRYPT_RAND);
// openssl_random_pseudo_bytes
$iv_size = openssl_cipher_iv_length("AES-128-ECB");
$iv = openssl_random_pseudo_bytes($iv_size);
```
3. 替换 mcrypt_encrypt() 函数。
将 mcrypt_encrypt($cipher, $key, $data, $mode, $iv)
替换为 openssl_encrypt($data, $cipher, $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv)
。
```php
// mcrypt_encrypt
$encrypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB, $iv);
// openssl_encrypt
$encrypted_text = openssl_encrypt($text, "AES-128-ECB", $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $iv);
```
4. 结果验证
执行下面的代码,如果输出一致,则说明替换成功。
```php
$key = "your_key_here";
$text = "your_text_here";
// mcrypt
$mcrypt_iv_size = mcrypt_get_iv_size(MCRYPT_RIJNDAEL_128, MCRYPT_MODE_ECB);
$mcrypt_iv = mcrypt_create_iv($mcrypt_iv_size, MCRYPT_RAND);
$mcrypt_encrypted_text = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_ECB, $mcrypt_iv);
$mcrypt_base64_encrypted_text = base64_encode($mcrypt_encrypted_text);
// openssl
$openssl_iv_size = openssl_cipher_iv_length("AES-128-ECB");
$openssl_iv = openssl_random_pseudo_bytes($openssl_iv_size);
$openssl_encrypted_text = openssl_encrypt($text, "AES-128-ECB", $key, OPENSSL_RAW_DATA|OPENSSL_ZERO_PADDING, $openssl_iv);
$openssl_base64_encrypted_text = base64_encode($openssl_encrypted_text);
if ($mcrypt_base64_encrypted_text === $openssl_base64_encrypted_text) {
echo "Successfully replaced mcrypt with openssl.";
} else {
echo "Failed to replace mcrypt with openssl.";
}
```
示例
示例 1:PHP 中使用 AES 加密
function aes_encrypt($data, $key) {
$iv_size = openssl_cipher_iv_length("AES-128-CTR");
$iv = openssl_random_pseudo_bytes($iv_size);
$encrypted_data = openssl_encrypt($data, "AES-128-CTR", $key, OPENSSL_RAW_DATA, $iv);
$result = base64_encode($iv . $encrypted_data);
return $result;
}
function aes_decrypt($data, $key) {
$data = base64_decode($data);
$iv_size = openssl_cipher_iv_length("AES-128-CTR");
$iv = substr($data, 0, $iv_size);
$encrypted_data = substr($data, $iv_size);
$result = openssl_decrypt($encrypted_data, "AES-128-CTR", $key, OPENSSL_RAW_DATA, $iv);
return $result;
}
示例 2:Laravel 中使用 AES 加密
$encrypted_data = encrypt($data);
$decrypted_data = decrypt($encrypted_data);
这里使用了 Laravel 自带的加密解密函数,可以自由切换加密算法。
结论
本文详细讲解了如何在 PHP 7.1 中使用 openssl 扩展替换 mcrypt 扩展,并给出了两个实际使用场景的示例。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:PHP7.1中使用openssl替换mcrypt的实例详解 - Python技术站