PHP 加密
PHP 的早期版本包含 mcrypt 扩展,该扩展提供了加密/解密功能。由于缺乏维护,mcrypt 扩展已被弃用并从 PHP 7.2 版本起移除。PHP 现在包含 OpenSSL 库,该库具有广泛的功能来支持加密和解密特性。
OpenSSL 支持各种加密算法,例如 AES(Advanced Encryption Standard)。所有支持的算法可以通过调用 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 cipher mode(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;
}
// 要加密的字符串
$source = "PHP: Hypertext Preprocessor";
// 显示原始字符串
echo "加密前: " . $source . "\n";
$algo = "BF-CBC";
$opt=0;
$ivlength = openssl_cipher_iv_length($algo);
$iv = random_bytes($ivlength);
$key = "abcABC123!@#";
// 加密过程
$encstring = sslencrypt($source, $algo, $key, $opt, $iv);
// 显示加密字符串
echo "加密字符串: " . $encstring . "\n";
// 解密过程
$decrstring = ssldecrypt($encstring, $algo, $key, $opt, $iv);
// 显示解密字符串
echo "解密字符串: " . $decrstring;
?>
它将产生以下 输出 −
加密前: PHP: Hypertext Preprocessor 加密字符串: 解密字符串: