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:
廣告