- 我们应该计算密码的哈希值而不是加密他,加密是双向算法,而哈希是单项算法
- 目前公认的最安全的哈希算法是bcrypt
- 开发web应用时,会在两处地方用到密码哈希API:注册和登录用户,以下为操作代码。
/**
* 注册用户时 计算密码哈希值
* 密码的哈希值应存储在VARCHAR(255)类型的数据库列中。便于以后存储比现在的bcrypt算法得到的哈希值更长的密码
* @param string $id
* @param string $password
* @throws EXception
*/
function user_register($id, $password) {
// 计算密码哈希值, PASSEWORD_DEFAULT表示使用bcrypt算法, cost——工作因子,表示计算次数
$passwordHash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 10]);
if ($passwordHash === false) {
throw new \EXception('Password hash failed');
}
//创建账户
$user = new User();
$user->id = $id;
$user->password = $passwordHash;
$user->save();
}
function user_login($id, $password) {
//查找账户
$user = User::findById($id);
//验证密码和账户密码的哈希值是否匹配
if (password_verify($password, $user->password) === false) {
throw new \Exception("Invild password");
}
//如果需要重新计算密码的哈希值
$currentHashAlgorithm = PASSWORD_DEFAULT;
$currentHashOptions = array('cost' => 15);
$passwordNeedRehash = password_needs_rehash($user->password, $currentHashAlgorithm, $currentHashOptions);
if ($passwordNeedRehash === true) {
$user->password = password_hash($password, $currentHashAlgorithm, $currentHashOptions);
$user->save();
}
}
try{
user_register('allen', '666');
} catch (Exception $e) {
echo $e->getMessage();
}