PHP7.1中使用openssl替换mcrypt的实例详解

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

详细步骤

  1. 确认 PHP 版本是否为 7.1 及以上,以及是否安装了 openssl 扩展。
  2. 替换 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技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • php过滤器使用详解

    以下是“PHP过滤器使用详解”的完整使用攻略,包括过滤器的基本概念、常见方法和示例说明等内容。 过滤器基本概念 过滤器是指在处理用户输入时,对数据进行过滤和验证的一种机制。在PHP中,过滤器可以有效地防止恶意攻击和非法输入,提高程序的安全性和可靠性。 常见方法 以下是过滤器的常见方法: 1. 使用filter_var函数 filter_var函数可以对一个变…

    PHP 2023年5月12日
    00
  • PHP实现将MySQL重复ID二维数组重组为三维数组的方法

    为了方便阅读,我将对这个话题进行拆分,分别介绍“PHP如何从MySQL中获取重复ID的二维数组”和“PHP如何将重复ID的二维数组重组为三维数组”两个部分。 一、从MySQL中获取重复ID的二维数组 连接数据库 首先需要使用PHP连接MySQL数据库,可以使用mysqli或PDO等方式连接数据库。这里给出一个用mysqli进行连接和查询的示例: // 连接数…

    PHP 2023年5月26日
    00
  • php实现的SSO单点登录系统接入功能示例分析

    来讲一下“php实现的SSO单点登录系统接入功能示例分析”的完整攻略吧。 什么是SSO单点登录系统? SSO全称为“Single Sign-On”,单点登录系统是一种集中的验证系统,用户可以使用一个用户名和密码来访问多个系统,而不必在不同系统之间自己输入用户名和密码。 实现SSO单点登录系统接入功能 实现SSO单点登录系统接入功能的步骤如下: 安装SSO单点…

    PHP 2023年5月24日
    00
  • php下检测字符串是否是utf8编码的代码

    要检测字符串是否是UTF-8编码,可以使用以下步骤: 步骤一:使用正则表达式检测字符串是否符合UTF-8格式 首先,可以使用PHP的正则表达式函数preg_match()检测字符串是否符合UTF-8编码。下面是一个例子: $string = "Hello, 世界!"; if (preg_match("//u", $st…

    PHP 2023年5月26日
    00
  • php实现设计模式中的单例模式详解

    当多个对象共用同一个实例时,就是使用单例模式的场景。在PHP中,我们可以使用静态变量或全局变量来实现单例模式。 实现单例模式的两种方法 1. 饿汉式(线程安全) 饿汉式单例是指在类加载时就创建一个单例对象,并且单例对象是final类型,在使用时已经创建好了,不需要检查是否为空,可以提高性能。但是如果单例类的构造函数中含有很多耗时的操作,会导致程序启动变慢。 …

    PHP 2023年5月27日
    00
  • 分析PHP中单双引号的误区和双引号小隐患

    分析PHP中单双引号的误区和双引号小隐患: 一、单引号和双引号的使用 在PHP中,单引号和双引号都可以用来表示字符串,但二者有着不同的作用和使用场景。 单引号字符串的特点是:字符串中的变量或者转义字符不会被解析,而是原样输出。 在单引号字符串中只有单引号需要使用转义符号,在其他地方可以直接使用单引号输出。 举例来说: $name = ‘Tom’; echo …

    PHP 2023年5月26日
    00
  • PHP单例模式是什么 php实现单例模式的方法

    PHP单例模式是一种常见的设计模式,它保证一个类只能创建一个实例,并提供全局访问点。PHP实现单例模式的方法有多种,下面详细介绍两种实现方法。 什么是PHP单例模式? 单例模式是一种创建型设计模式,它主要解决的问题是保证一个类只有一个实例,并提供一个全局访问点。在PHP应用中,单例模式经常用于管理数据库连接、日志输出对象,以及共享的数据等。 实现PHP单例模…

    PHP 2023年5月27日
    00
  • PHP 闭包详解及实例代码

    PHP 闭包详解及实例代码 什么是闭包函数 闭包函数(Closure),俗称“匿名函数”,是一种可以被存储在变量中的函数,可以作为参数传递给其他函数,也可以从函数中返回。 闭包函数是满足以下条件的函数: 函数的定义没有名称 函数定义时使用了 use 关键字绑定了外部变量 函数可以被赋值给变量 闭包函数的语法 闭包函数的语法如下: $functionName …

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部