密码验证;这样做是否安全?

时间:2010-05-04 18:39:38

标签: php mysql html security

我有一个分类广告网站,每个人都可以放置他们产品的广告。

对于每个分类,用户必须输入密码(以便他们可以随时删除分类)。

所以基本上,当有人想要删除分类时,他们点击分类,点击删除按钮,然后输入通行证。

我使用MySql作为数据库。

我基本上使用这段代码:

if ($pass==$row['poster_password'])

从MySql中获取行[poster_password] ...

你怎么看? 感谢

8 个答案:

答案 0 :(得分:9)

请参阅:Secure hash and salt for PHP passwords

在进入数据库的路上哈希密码(可能含有一些盐)。将散列密码存储在数据库中(不是实际密码)。然后从数据库中获取散列密码并散列输入密码并比较散列密码。

一些蹩脚的伪代码:

password_hash = hash(password_cleartext)
# store password_hash in database

随后:

input_password_hash = hash(input_password_cleartext)
fetched_password_hash_from_db = fetch(db, password_hash)
if (input_password_hash == fetched_password_hash_from_db) {
    ... authenticated ...
}

首先使用php,请尝试:http://php.net/manual/en/function.sha1.php

答案 1 :(得分:4)

您的代码看起来很安全,但您的设计可能需要一些工作。

SQL注入

代码的危险部分是将任何内容存储在数据库中,或者向用户显示从用户收集的任何内容。因此,您需要注意的部分发生在您的示例之前。确保您正在验证,过滤和转发从用户收集的任何数据,包括密码和广告信息。

<强>加密

将密码存储在数据库中的优点是,如果用户丢失密码,您可以通过电子邮件或其他方式检索密码。

但是,如果您确实存储了密码,则应使用密钥对其进行加密存储,这样,如果有人能够直接读取您对数据库的读取权限,则无法以纯文本格式读取所有密码。但是,你必须在某个地方存储密钥,如果有人获得了你的密钥并且可以访问你的数据库,他们就可以访问所有密码。

哈希值(推荐)

最佳做法是更安全,只在数据库中存储密码的单向哈希值(SHA1或SHA256)而不是实际密码。这样,您无法检索密码。通过丢弃一些数据,哈希值是有意的一种方式。

您可以散列用户输入的密码,并将哈希值与存储的哈希值进行比较,以查看是否匹配,而不是检索原始密码。如果用户在这种情况下丢失密码,则不会通过电子邮件将密码发送给用户,而是通过电子邮件向用户发送新的随机生成的密码。

仅存储哈希值可以进一步保护您的数据,因为即使用户具有对数据库的读访问权限,哈希值也没有优势,并且没有密钥可以解锁所有哈希值。

当您对密码进行哈希处理时,请务必使用随机盐值并存储盐以保护您的哈希列表免受彩虹攻击。

<强>摘要

有时您无法选择密码。有时密码来自另一个系统,因此您并不总是有选择,有时您的上司(甚至可能是用户)会要求他们能够检索密码,但是,如果可能,您应该选择更安全的选项

请注意,所有此加密和哈希值业务仅部分保护您的服务器免受能够获取对您的数据的只读访问权限的人的影响。有时候,获取数据就足够了,所以如果用户可以读取密码哈希,他们可以读取您的信用卡号吗?

您需要保护您的数据库。您的数据库系统上是否有安全密码?您是否只允许本地访问您的数据?您是否创建了一个在应用程序中使用最少权限的数据库用户?您是否正确保护自己免受SQL注入和脚本攻击?

如果有人对您的数据具有读写权限,那么整个密码业务就变得毫无意义了。

答案 2 :(得分:2)

不要将实际密码存储在数据库中。而是存储校验和(MD5,SHA1等)。如果要进行比较,请执行用户提交的值的校验和,并比较校验和。

这样你就不会在内存中找到实际的密码。

答案 3 :(得分:1)

最佳做法是在数据库中保留盐渍sha1哈希:

if (sha1($pass.$row['poster_salt'])==$row['poster_password'])

(poster_salt是在用户选择密码时生成并保存的随机字符串。)

这样,如果攻击者可以访问您的数据库,他们仍然无法获取用户的密码(也可能在其他地方也使用过 - 大多数人都懒得为不同的网站选择不同的密码)。

此外,您应该使用安全(HTTPS)连接。并要求足够强大的密码。

(至少如果您需要良好的安全性,在简单的广告列表中可能会出现过度杀伤)。

答案 4 :(得分:0)

您应该以某种方式散列密码并使用散列版本进行存储和比较。有关详细信息,请参阅此链接:

http://phpsec.org/articles/2005/password-hashing.html

答案 5 :(得分:0)

我会在存储密码之前对其进行加密,然后在检索密码时进行解密,这样您就可以根据用户输入的明文进行检查(根据上面的示例代码)。

此外,保护自己免受任何SQL injections的侵害,或者有人可以看到您数据库中的所有密码(和其他数据)。

答案 6 :(得分:0)

这意味着密码会以未加密的方式放入您的密码中。如果是这种情况,则在输入密码时应使用某种加密方式。这样做的一种方法是MD5函数,它会对密码进行哈希处理。

进行插入时,您可以

Insert into table(email, password, whatever) values('$email', md5($password), whatever)

比较时你会做

if (md5($pass) == $row['password'])

答案 7 :(得分:0)

我的建议如下

users表有两列,一列叫“密码”,另一列叫“盐”

$password =  'youruserpassword in plain text';
$salt = bin2hex(openssl_random_pseudo_bytes(32));
$passtostore = hash_hmac('sha384', $password, $salt);
insert into users(password, salt) values($passtostore, $salt);

然后验证用户是否输入了正确的密码......

从数据库和

中检索密码和salt
if(hash_hmac('sha384',$userpass, $row['salt']) === $row['password']) { 
 // is valid 
 }