在PHP项目开发中,用户密码、支付信息、个人隐私数据等敏感内容都需要经过加密处理,才能避免泄露带来的安全风险。不同的数据场景需要匹配不同的加密方案,既要保证加密强度,也要兼顾性能和使用便捷性。

常用PHP加密方法分类
PHP提供的加密方案主要分为三类,开发者可以根据数据使用场景选择:
- 哈希加密:单向加密,无法解密,适合存储不需要还原的敏感数据,比如用户密码
- 对称加密:加密和解密使用同一个密钥,速度快,适合加密需要还原的业务数据
- 非对称加密:使用公钥加密、私钥解密,安全性更高,适合传输敏感密钥或重要数据
哈希加密实现(以密码存储为例)
PHP内置了password_hash()和password_verify()函数,专门用于密码的哈希加密和验证,不需要开发者自己实现哈希逻辑,默认使用bcrypt算法,安全性有保障。
<?php
// 用户注册时生成密码哈希
$userPassword = 'user_123456'; // 用户提交的原始密码
$passwordHash = password_hash($userPassword, PASSWORD_DEFAULT);
// 将$passwordHash存入数据库即可,不需要存原始密码
// 用户登录时验证密码
$inputPassword = 'user_123456'; // 用户登录输入的密码
$storedHash = '$2y$10$xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'; // 从数据库取出的哈希值
if (password_verify($inputPassword, $storedHash)) {
echo '密码验证通过';
} else {
echo '密码错误';
}
?>注意哈希加密是单向的,无法从哈希值还原出原始数据,因此只适合不需要解密的数据场景,不要尝试对需要还原的业务数据使用哈希加密。
对称加密实现(AES加密解密)
如果需要加密后还能还原数据,比如用户的手机号、地址等,可以使用AES对称加密。PHP的openssl扩展提供了相关函数,下面是实现示例:
<?php
class AesEncrypt {
private $key; // 加密密钥,需要妥善保管
private $iv; // 初始化向量,需要和密钥一起保存
private $method = 'AES-256-CBC'; // 加密算法
public function __construct($key, $iv) {
$this->key = $key;
$this->iv = $iv;
}
// 加密方法
public function encrypt($data) {
$encrypted = openssl_encrypt($data, $this->method, $this->key, 0, $this->iv);
return base64_encode($encrypted); // 转成base64方便存储传输
}
// 解密方法
public function decrypt($encryptedData) {
$encrypted = base64_decode($encryptedData);
return openssl_decrypt($encrypted, $this->method, $this->key, 0, $this->iv);
}
}
// 使用示例,密钥和iv需要随机生成,长度符合算法要求
$key = openssl_random_pseudo_bytes(32); // AES-256需要32位密钥
$iv = openssl_random_pseudo_bytes(16); // CBC模式需要16位iv
$aes = new AesEncrypt($key, $iv);
$phone = '13800138000'; // 需要加密的手机号
$encryptedPhone = $aes->encrypt($phone);
echo '加密后数据:' . $encryptedPhone . '<br>';
$decryptedPhone = $aes->decrypt($encryptedPhone);
echo '解密后数据:' . $decryptedPhone;
?>非对称加密简单应用
非对称加密适合传输对称加密的密钥,或者加密少量重要数据。PHP可以用openssl扩展生成公私钥对,实现加密解密:
<?php
// 生成公私钥对(实际项目中可以提前生成好保存)
$config = array(
"private_key_bits" => 2048,
"private_key_type" => OPENSSL_KEYTYPE_RSA,
);
$res = openssl_pkey_new($config);
openssl_pkey_export($res, $privateKey); // 导出私钥,妥善保管
$publicKey = openssl_pkey_get_details($res)["key"]; // 导出公钥,可以公开
// 公钥加密
$data = '需要传输的对称密钥';
openssl_public_encrypt($data, $encrypted, $publicKey);
$encrypted = base64_encode($encrypted);
// 私钥解密
$encrypted = base64_decode($encrypted);
openssl_private_decrypt($encrypted, $decrypted, $privateKey);
echo '解密后的数据:' . $decrypted;
?>加密数据的安全存储技巧
加密后的数据和安全相关的配置需要遵循以下存储原则:
- 加密密钥不要硬编码在代码里,也不要和加密数据存在同一个数据库表中,可以放在服务器环境变量或者专门的密钥管理服务中
- 哈希后的密码直接存入数据库即可,不需要额外加密,验证时直接用
password_verify()函数比对 - 对称加密的iv可以和加密后的数据存在一起,因为iv的作用是增加加密随机性,泄露iv不会影响加密安全性
- 数据库中存储敏感字段时,建议给字段设置合适的加密长度,避免存储时被截断导致无法解密
常见加密误区提醒
不要用base64编码代替加密,base64只是编码方式,任何人都可以解码还原原始数据,没有任何安全性。
不要使用已经被淘汰的加密算法,比如MD5、SHA1单独做密码加密,这些算法计算速度快,容易被暴力破解。
对称加密的密钥要定期轮换,避免密钥泄露后所有历史加密数据都被破解。
根据实际业务场景选择合适的加密方案,才能既保证数据安全,又不影响项目的正常运行效率。