php的密碼加密與驗(yàn)證有好多方法, 大家用的也大多不一樣吠勘, php在5.5之后本身已經(jīng)有一個(gè)簡(jiǎn)單有效的方法了 方便且容易記所以平時(shí)使用這個(gè)就可以了
實(shí)現(xiàn)原理 password_hash()函數(shù)
/** 過濾容器 */
$clean = array();
/** 用戶名及密碼非空和長(zhǎng)度判斷略過 */
//...
/**
* 對(duì)密碼計(jì)算散列
* 參數(shù)二加密方式 7.0中又去除了 其中一個(gè) 建議使用默認(rèn)
*/
$hashed_password = password_hash($_POST['password'], PASSWORD_DEFAULT);
/** 允許字母數(shù)字用戶名 */
if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
} else
{
echo '用戶錯(cuò)誤';die();
}
/** 保存數(shù)據(jù)庫(kù) 代碼略過 */
password_hash() 使用足夠強(qiáng)度的單向散列算法創(chuàng)建密碼的散列(hash)。 password_hash() 兼容 crypt()。 所以, crypt() 創(chuàng)建的密碼散列也可用于 password_hash()俱恶。
- 驗(yàn)證 password_verify()
/** 登錄驗(yàn)證 */
/** 允許字母數(shù)字用戶名 */
if (ctype_alnum($_POST['username']))
{
$clean['username'] = $_POST['username'];
} else
{
echo '用戶錯(cuò)誤';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();
}
既然自帶方法能實(shí)現(xiàn) 沒有別的特殊的東西沒必要用其他的方法, 有點(diǎn)就是系統(tǒng)方法容易調(diào)用和使用, 另外一點(diǎn)就是 相同明文也會(huì)生成不同的散列值, 而且轉(zhuǎn)換成明文的計(jì)算成本也是相當(dāng)大.