PHP中的密码学:数据加密与哈希
Web应用程序的安全性是开发者的关键任务之一。PHP提供了强大的内置工具用于数据的密码学保护。在本文中,我们将探讨两个主要方向:加密(可逆的数据转换)和哈希(用于完整性验证的单向转换)。
1. PHP中的哈希
哈希用于存储密码、校验和以及验证数据完整性。在PHP中,为此目的使用函数password_hash()和hash()。
1.1. 密码的安全哈希
切勿使用md5或sha1来存储密码。应通过password_hash()使用bcrypt算法:
<?php// 密码哈希$password = 'MySecureP@ss123';$hash = password_hash($password, PASSWORD_BCRYPT, ['cost' => 12]);
echo $hash; // $2y$12$...
// 密码验证if (password_verify('MySecureP@ss123', $hash)) { echo "密码正确!";} else { echo "密码错误!";}?>函数password_hash()会自动生成盐值并使用安全的算法。参数cost用于调节计算复杂度(建议值为10-12)。
1.2. 任意数据的哈希
对于文件或数据的完整性验证,请使用SHA-256或SHA-3算法:
<?php$data = "需要验证的重要数据";$hash_sha256 = hash('sha256', $data);$hash_sha3_256 = hash('sha3-256', $data);
echo "SHA-256: " . $hash_sha256 . PHP_EOL;echo "SHA3-256: " . $hash_sha3_256 . PHP_EOL;
// 文件完整性验证$file_hash = hash_file('sha256', '/path/to/file.zip');echo "文件哈希: " . $file_hash;?>2. PHP中的对称加密
对称加密使用同一个密钥对数据进行加密和解密。PHP支持OpenSSL和Sodium。
2.1. 通过OpenSSL加密(AES-256-GCM)
推荐模式为AES-256-GCM,它提供数据认证:
<?php$data = "秘密消息";$key = random_bytes(32); // 256位密钥$iv = random_bytes(12); // 96位初始化向量
// 加密$encrypted = openssl_encrypt( $data, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
// 解密$decrypted = openssl_decrypt( $encrypted, 'aes-256-gcm', $key, OPENSSL_RAW_DATA, $iv, $tag);
echo "原始数据: " . $data . PHP_EOL;echo "解密后: " . $decrypted . PHP_EOL;echo "认证标签: " . bin2hex($tag);?>重要提示:请保存$key和$iv(或它们的组合)以便解密。标签$tag用于验证数据完整性。
2.2. 通过Sodium加密(libsodium)
从PHP 7.2开始,Sodium已成为核心的一部分。它更简单且更安全:
<?php$data = "机密信息";$key = sodium_crypto_secretbox_keygen(); // 生成密钥$nonce = random_bytes(SODIUM_CRYPTO_SECRETBOX_NONCEBYTES);
// 加密$ciphertext = sodium_crypto_secretbox($data, $nonce, $key);
// 解密$decrypted = sodium_crypto_secretbox_open($ciphertext, $nonce, $key);
echo "已加密: " . base64_encode($ciphertext) . PHP_EOL;echo "已解密: " . $decrypted . PHP_EOL;
// 清除内存sodium_memzero($key);?>3. 非对称加密(RSA)
非对称加密使用一对密钥(公钥/私钥)。用于安全数据传输:
<?php// 生成密钥$config = [ 'private_key_bits' => 2048, 'private_key_type' => OPENSSL_KEYTYPE_RSA,