A recent post on passwords 我有点偏离主题,并覆盖了很多本。一个珍闻:
一旦你对他们选择的密码感到满意,先用PHP加密,然后存储。下面的密码加密功能也不是我的想法,但解决了一些问题。 PHP中的加密可防止共享服务器上的人员拦截未加密的密码。每个用户添加一些不会改变的东西(我使用电子邮件,因为这是我的网站的用户名),并添加一个散列(SALT是一个简短的常量字符串,我改变每个网站)增加抵抗攻击。由于SALT位于密码中,并且密码可以是任意长度,所以用彩虹表进行攻击几乎是不可能的。或者,这也意味着人们不能更改他们的电子邮件,并且您不能更改SALT而不会破坏每个人的密码。
function password_crypt($email,$toHash) {
$password = str_split($toHash,(strlen($toHash)/2)+1);
return hash('sha256', $email.$password[0].SALT.$password[1]);
}
因此,对用户密码的第一个输入,在伪代码:
define(SALT,'blah');
$hashed_password = password_crypt($email,$password);
INSERT INTO users (email,hashed_password) VALUES ($email,$hashed_password);
那就要检查一下在伪代码随后登录:
define(SALT,'blah');
$user_hashed_password = password_crypt($_POST['username'],$_POST['password']);
SELECT email FROM users WHERE email = ? AND hashed_password = $user_hashed_password LIMIT 1
如果你得到一个行回来,有效登录。
如果还好,你能否详细说明第1点和第3点。我不太明白你的意思。谢谢 – user179780 2009-10-24 23:06:24
感谢所有的信息,我会研究它。我这样做的原因是因为如果用户重新登录到系统中,他们需要使用他们在表单中键入的密码登录。只有在将密码转换回原始格式时才能识别该密码。这是正确的我在想什么?如果我错了,请纠正我,我目前还没有读入密码散列函数。 – user179780 2009-10-24 23:40:45
这可以工作,而不需要知道密码是通过散列表得到的。你哈希他们的原始密码,并重新哈希它再次比较哈希而不是密码。 – 2009-10-24 23:45:52