php加盐实现函数
PHP 加盐实现方法
加盐(Salting)是一种增强密码安全性的技术,通过在用户密码前或后添加随机字符串(盐值),再经过哈希处理存储。PHP 提供了多种方式实现加盐哈希。
使用 password_hash 函数
PHP 5.5+ 推荐使用内置的 password_hash 函数,它自动生成盐值并与密码一起哈希:
$password = 'user_password';
$hashedPassword = password_hash($password, PASSWORD_DEFAULT);
PASSWORD_DEFAULT 目前使用 BCRYPT 算法,盐值自动生成并包含在结果中。验证时使用 password_verify:
$isValid = password_verify($password, $hashedPassword);
手动加盐与哈希
如果需要手动控制盐值,可以采用以下方式:
$password = 'user_password';
$salt = bin2hex(random_bytes(16)); // 生成随机盐值
$hashedPassword = hash('sha256', $salt . $password);
存储时需要同时保存盐值和哈希结果。验证时重新计算哈希:
$storedSalt = '...'; // 从数据库获取盐值
$storedHash = '...'; // 从数据库获取哈希值
$inputHash = hash('sha256', $storedSalt . $inputPassword);
$isValid = hash_equals($storedHash, $inputHash); // 安全比较
使用 crypt 函数
crypt 函数也支持加盐哈希,但需明确指定盐值格式:
$password = 'user_password';
$salt = '$2y$10$' . bin2hex(random_bytes(11)); // BCRYPT 盐格式
$hashedPassword = crypt($password, $salt);
验证时直接比较 crypt 结果:
$isValid = hash_equals($hashedPassword, crypt($inputPassword, $hashedPassword));
安全注意事项
盐值应足够长(至少 16 字节),使用加密安全的随机数生成器(如 random_bytes)。避免使用固定盐值或短盐值。
哈希算法选择应优先考虑 PASSWORD_DEFAULT(目前为 BCRYPT),而非弱算法如 MD5 或 SHA1。
比较哈希值时使用 hash_equals 防止时序攻击,而非直接 == 操作符。







