【发布时间】:2014-07-29 07:15:45
【问题描述】:
我正在更新我在我的网站上存储密码的方式,并希望分享我的流程想法以确保我做对了:
首先,用户将选择一个密码,我将对其进行哈希处理:
function generateHash($password) {
if (defined("CRYPT_BLOWFISH") && CRYPT_BLOWFISH) {
$salt = '$2y$11$' . substr(md5(uniqid(rand(), true)), 0, 22);
return crypt($password, $salt);
}
}
$passToStore = generateHash($userPassword);
然后我将把它存储在一个纯粹用于密码的表中,并以用户表中自动生成的userId 作为键:
userId INT
hashedPassword VARCHAR(22)
forgottenHash VARCHAR(36)
当用户返回并尝试登录时,我将从他们输入的电子邮件(用户名)中提取加入选择查询中的密码。然后检查是否匹配他们输入的内容:
function verify($passwordEntered, $hashedPasswordStored) {
return crypt($passwordEntered, $hashedPasswordStored) == $hashedPassword;
}
如果用户忘记了密码,他们输入他们的电子邮件地址,我将生成一个随机散列并使其唯一,添加 strtotime 当前时间/日期(进入 forgottenHash),然后将链接发送给他们用他们的电子邮件和随机散列作为键并在 URL 中单击。
如果他们点击链接并且哈希值与该电子邮件地址的用户匹配,我将删除存储的哈希密码并让他们创建一个新密码。我担心重置密码的思考过程,但这对我来说似乎是正确的。但我不是黑客。
这是管理密码的好方法还是有更好的方法?
【问题讨论】:
-
rand()不适合加密随机性。 -
为什么不用password_hash()和password_verify()?
-
我建议不要直接使用 hash() 或 crypt(),而是使用 PHP 5.5 的 built-in password functions,旧版本可以通过一个文件下载。
-
@IMSoP 甚至都不知道它的存在。节省大量工作,非常感谢您指出。
-
另见 Openwall 的 PHP password hashing framework (PHPass)。它的便携性和强化了对用户密码的一些常见攻击。