PHP – 加密



PHP 的早期版本包含 mcrypt 扩展,该扩展提供了加密/解密功能。由于缺乏维护,mcrypt 扩展已弃用,并从 PHP 7.2 及更高版本中删除。PHP 现在包含 OpenSSL 库,该库具有广泛的功能来支持加密和解密功能。

OpenSSL 支持各种加密算法,例如 AES(高级加密标准)。可以通过调用 openssl_get_cipher_methods() 函数获取所有支持的算法。

OpenSSL 扩展中的两个重要函数是:

  • openssl_encrypt() − 加密数据

  • openssl_decrypt() − 解密数据

openssl_encrypt() 函数

此函数使用给定的方法和密钥加密给定的数据,并返回一个原始或 base64 编码的字符串:

openssl_encrypt(
   string $data,
   string $cipher_algo,
   string $passphrase,
   int $options = 0,
   string $iv = "",
   string &$tag = null,
   string $aad = "",
   int $tag_length = 16
): string|false

该函数具有以下参数

序号 参数及描述
1

data

要加密的明文消息数据。

2

cipher_algo

密码方法。

3

passphrase

密码短语。如果密码短语短于预期,则用 NULL 字符填充;如果密码短语长于预期,则将其截断。

4

options

options 是 OPENSSL_RAW_DATA 和 OPENSSL_ZERO_PADDING 标志的按位析取。

5

iv

非 NULL 初始化向量。

6

tag

使用 AEAD 密码模式(GCM 或 CCM)时,通过引用传递的身份验证标签。

7

aad

其他经过身份验证的数据。

8

tag_length

身份验证标签的长度。对于 GCM 模式,其值可以在 4 到 16 之间。

如果成功,则该函数返回加密的字符串;如果失败,则返回false

openssl_decrypt() 函数

此函数接收一个原始或 base64 编码的字符串,并使用给定的方法和密钥对其进行解密。

openssl_decrypt(
   string $data,
   string $cipher_algo,
   string $passphrase,
   int $options = 0,
   string $iv = "",
   ?string $tag = null,
   string $aad = ""
): string|false

openssl_decrypt() 函数使用与openssl_encrypt 函数相同的参数。

如果成功,则此函数返回解密的字符串;如果失败,则返回 false。

示例

请查看以下示例:

<?php
   function sslencrypt($source, $algo, $key, $opt, $iv) {
      $encstring = openssl_encrypt($source, $algo, $key, $opt, $iv);
      return $encstring;
   }

   function ssldecrypt($encstring, $algo, $key, $opt, $iv) {
      $decrstring = openssl_decrypt($encstring, $algo, $key, $opt, $iv);
      return $decrstring;
   }

   // string to be encrypted
   $source = "PHP: Hypertext Preprocessor";

   // Display the original string
   echo "Before encryption: " . $source . "\n";
   $algo = "BF-CBC";
   $opt=0;
   $ivlength = openssl_cipher_iv_length($algo);
   $iv = random_bytes($ivlength);
   $key = "abcABC123!@#"; 

   // Encryption process
   $encstring = sslencrypt($source, $algo, $key, $opt, $iv);

   // Display the encrypted string
   echo "Encrypted String: " . $encstring . "\n";

   // Decryption process
   $decrstring = ssldecrypt($encstring, $algo, $key, $opt, $iv);

   // Display the decrypted string
   echo "Decrypted String: " . $decrstring;
?>

它将生成以下输出

Before encryption: PHP: Hypertext Preprocessor
Encrypted String: 
Decrypted String:
广告