php的密码加密与验证有好多方法, 大家用的也大多不一样, php在5.5之后本身已经有一个简单有效的方法了 方便且容易记所以平时使用这个就可以了
实现原理 password_hash()函数
/** 过滤容器 */
$clean = array();
/** 用户名及密码非空和长度判断略过 */
//...
/**
* 对密码计算散列
* 参数二加密方式 7.0中又去除了 其中一个 建议使用默认
*/
$hashed_password = password_hash($_POST['password'], PASSWORD_DEFAULT);
/** 允许字母数字用户名 */
if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
} else
{
echo '用户错误';die();
}
/** 保存数据库 代码略过 */
password_hash() 使用足够强度的单向散列算法创建密码的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 创建的密码散列也可用于 password_hash()。
- 验证 password_verify()
/** 登录验证 */
/** 允许字母数字用户名 */
if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
} else
{
echo '用户错误';die();
}
$user = pdo_get('user', array('username' => $clean['username']));
if (!empty($user))
{
$hashed_password = pdo_getColumn('user', array('id' => $user['id']), 'password');
} else
{
echo '未找到用户信息';die();
}
if (password_verify($_POST['password'], $hashed_password))
{
echo '登录失败';die();
} else
{
echo '登录成功';die();
}
既然自带方法能实现 没有别的特殊的东西没必要用其他的方法, 有点就是系统方法容易调用和使用, 另外一点就是 相同明文也会生成不同的散列值, 而且转换成明文的计算成本也是相当大.