我在使用以下代码登录用户时遇到问题。
似乎当我用正确的用户密码执行我的if语句时,用户输入的密码和我数据库中的密码不匹配。有人可以就我做错的事情向我提出意见吗?
$pwd = hashed password in my database
$pass = password users enter on logi page
if ($pwd === PwdHash($pass,substr($pwd,0,9))) {
function PwdHash($pwd, $salt = null)
{
if ($salt === null) {
$salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
}
else {
$salt = substr($salt, 0, SALT_LENGTH);
}
return $salt . sha1($pwd . $salt);
}
答案 0 :(得分:2)
有人可以就我做错的事情向我提出意见吗?
不要冒犯你,但你真的在犯所有错误。让我们从头开始:
$salt = substr(md5(uniqid(rand(), true)), 0, SALT_LENGTH);
这是一种计算盐的非常差的方法。从rand
man page开始:
此函数不会生成加密安全值,也不应用于加密目的。
就在那里,你的整个机制崩溃了。安全性与其最弱的组件一样好。但它并不止于此。 uniqid()
创建一个唯一的ID,但是主要问题是它基于当前时间。拥有独特的盐是好的,但由于它是严格基于时间的,它使它可预测,这非常糟糕,远远超过了使它独特的好处。
接下来,你md5盐。这在安全性方面绝对没有增加任何内容,可能会引起争议,它实际上会降低由于md5冲突导致的安全性。
现在您要如何对您的密码进行哈希处理:
$salt . sha1($pwd . $salt);
Sha1非常快,因此是密码散列的一个非常糟糕的选择。做salt . fastHash(password . salt)
只是默默无闻的安全,根本不是安全。
那么应该你在做什么?
第一步:停止滚动您自己的密码散列机制,并将其交给比您和我更聪明的专家。
第二步:使用password_hash。如果您没有PHP 5.5,请检查该页面上的注释,以获取与早期版本兼容的兼容性库。这很简单:
$hash = password_hash("someAmazingPassword", PASSWORD_DEFAULT);
然后查看password_verify()以验证哈希值。
答案 1 :(得分:0)
您应该像执行生成器功能一样将SALT_LENGTH置于检查功能中。 。 手动检查它们是不同的还是相同的?