将用户的密码加密/哈希存储到数据库中。

3

3
如果你正在使用哈希函数(这是应该的),就无法获取原始密码。 - Oliver Charlesworth
5个回答

9

在数据库中存储密码时,始终仅使用(密码随机生成的盐)的哈希值(结合PHP搜索这些术语应该会有一些有用的结果)。

您永远不会恢复明文密码,而是提供一种方法让用户在点击唯一的推荐链接后选择新密码,您只能在请求时自动通过电子邮件发送。

(非常基本的安全措施)。

编辑:

我将解释为什么您需要盐。假设有人破坏了您的数据库,并获得了包含简单(例如MD5)密码哈希的user表。现在,他(或她)可以对整个表进行字典攻击,以获取简单密码组合(例如select * from users where pw_hash = ...)。如果您使用一个随机生成的(但已存储的)盐来哈希密码,则这种暴力破解攻击变得越来越难以利用。


3
首先要了解的是crypt()函数的作用。请阅读http://php.net/manual/en/function.crypt.php。它实际上是一种哈希函数,更确切地说,是单向哈希函数。因此,您将无法从中恢复密码。
在当今世界,如果用户“忘记”了他们的密码,最好的处理方式是创建一个新密码,将其存储并通过电子邮件发送给他们。这样做可以确保,如果他们为多个服务使用相同的密码,您不会无意中将这些其他服务暴露给不良分子。其次,如果不是原始用户请求密码,则下次他们尝试登录时会注意到他们的密码不再起作用。

2

请看我对相关问题的回答


基本上,你永远不要存储明文密码。数据库可能会被攻击,而大多数用户使用通用密码,这将允许攻击者访问大量数据。而且这可能是你的过错(在某种程度上)。

哈希(在你的情况下)的工作原理是这样的:

if hash(session.password) == database.hashed_password:
   # You can safely assume session.password == database.password.
   # Notice that I don't store database.password, but instead store:
   #
   #    database.hashed_password = hash(register.password)
   #
   # when the user registers. That way nobody will ever know the password.

您可以使用来使您的哈希更加安全。原理相同:
if hash(session.password + 'imasalt') == database.hashed_password_with_salt:
   # Same as above.

答案正确,但在实际应用中(出于我回答中所述的原因),您需要在哈希值旁边添加一个盐。 - ChristopheD
是的,我也给你的回复点个赞。我选择了他的答案,因为那正是我想知道的,尤其是在 #'s 中。 - Mackintoast
@ChristopheD:在我的数据库中,我使用用户的注册日期转换为UNIX时间戳进行盐值处理。我也会包含这个。 - Blender
1
@Blender:那不是随机的!盐应该完全随机。 - Borealid
对我来说已经足够随机了。sha512(sha512(user) + sha512(email) + sha512(password) + sha512(timestamp)) 不够好吗? - Blender
此外,盐不一定要是随机的。你必须从某个地方获取它。如果攻击者进入了你的数据库,他们也会知道你的盐。 - Blender

1

通常的做法是使用像SHA(以及过去的MD5)这样的单向哈希算法。这些无法被反转。如果您的用户需要恢复密码,则系统通常会重置它并告诉用户新密码。

如果您想要双向加密(强烈不建议存储密码),那么您的应用程序将需要保持秘密(或让用户提供秘密)。

请查看mcrypt http://php.net/manual/en/book.mcrypt.php


1
你不需要这样做。如果他们忘记了密码,你应该重置密码并发送电子邮件让他们创建一个新的密码,或者类似的操作。以一种可以被解密和检索的方式存储密码非常不安全,并且在某些国家可能是非法的(我不是律师)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接