在 PHP 开发中,数据安全至关重要,AES(Advanced Encryption Standard)加密算法是一种常用的对称加密技术,能够有效地保护数据的机密性。本文将详细介绍如何在 PHP 中使用 AES 进行加密和解密操作,并对代码进行详细注释。
一、AES 加密解密原理概述
AES 是一种对称加密算法,这意味着加密和解密使用相同的密钥。它通过对数据块进行一系列复杂的替换、置换和轮密钥加等操作,将原始数据转换为密文,在解密时则使用相同的密钥和逆操作将密文还原为原始数据。在 PHP 中,我们可以借助 openssl_encrypt 和 openssl_decrypt 函数来实现 AES 加密和解密。
二、加密代码实现与注释
// 原始字符串
$originalStr = "Hello, World!";
// 加密密钥,需妥善保管且长度要符合要求(AES-128 为 16 字节等)
$password = "123456";
// 加密算法及模式,这里采用 AES-128-CBC 模式
$method = 'AES-128-CBC';
// 生成初始化向量(IV),IV 与密钥一起使用可增加安全性,这里通过对密钥哈希取前 16 位得到
$iv = substr(hash('sha256', $password), 0, 16);
// 进行加密操作
$encryptedText = openssl_encrypt($originalStr, $method, $password, OPENSSL_RAW_DATA, $iv);
// 输出加密后的结果,由于加密结果可能包含不可打印字符,所以使用 base64_encode 进行编码以便显示
echo "加密后: ".base64_encode($encryptedText)."\n";
?>
在上述代码中,首先定义了原始字符串 $originalStr 和加密密钥 $password。然后指定了加密算法及模式 $method,这里选择了 AES-128-CBC。不同的模式有不同的特性,CBC 模式需要一个初始化向量。通过对密钥进行 sha256 哈希并取前 16 位生成初始化向量 $iv。这是因为 AES-128-CBC 模式要求 $iv 的长度为 16 字节。
使用 openssl_encrypt 函数进行加密,传入原始字符串、加密算法、密钥、加密选项(OPENSSL_RAW_DATA 表示输出原始二进制数据)和初始化向量,得到加密后的文本 $encryptedText。最后将加密结果进行 base64_encode 编码后输出。
三、解密代码实现与注释
// 加密后的文本(从之前的加密结果获取或传输过来),这里假设已经有了加密后的文本并进行 base64_decode 解码
$encryptedText = base64_decode('加密后的文本字符串');
// 加密密钥,与加密时使用的密钥相同
$password = "123456";
// 加密算法及模式,需与加密时一致
$method = 'AES-128-CBC';
// 初始化向量,与加密时生成的相同
$iv = substr(hash('sha256', $password), 0, 16);
// 进行解密操作
$decryptedText = openssl_decrypt($encryptedText, $method, $password, OPENSSL_RAW_DATA, $iv);
// 输出解密后的结果
echo "解密后: ". $decryptedText;
?>
在解密代码中,首先对可能经过 base64_encode 编码的加密文本进行 base64_decode 解码得到原始的加密数据 $encryptedText。再次指定与加密时相同的密钥 $password、加密算法及模式 $method 和初始化向量 $iv。
使用 openssl_decrypt 函数进行解密,传入加密文本、加密算法、密钥、解密选项(OPENSSL_RAW_DATA)和初始化向量,得到解密后的文本 $decryptedText 并输出。
四、注意事项
• 密钥的安全性至关重要,应妥善保管,避免泄露。
• 选择合适的加密算法和模式,不同的场景可能需要不同的选择。例如,对于一些对安全性要求极高的场景,可能需要考虑使用更长密钥的 AES 版本(如 AES-256)。
• 初始化向量应是随机且保密的,在每次加密时最好使用不同的 $iv,但在解密时必须使用与加密时相同的 $iv。 |