将用户密码加密/哈希到数据库中

时间:2012-01-25 22:16:53

标签: php mysql

对于在发布之前在表单中输入的用户密码,我只是做

<?php
   $pass=crypt($_POST['memberpwd']);   
?>

但是,如果用户可能要求,我怎么能在以后获得该密码的明文?谢谢。

编辑:我找到了How can I encrypt password data in a database using PHP?http://www.securityfocus.com/blogs/262,但我只是想在更基本的层面上了解这一点,以了解其实际工作方式。

5 个答案:

答案 0 :(得分:9)

始终只使用(密码随机生成的盐)的哈希值将密码存储在数据库中(谷歌搜索这些与PHP结合的条款应该会产生一些有用的结果)。

您永远不会恢复密码的纯文本版本,您可以在用户点击您只能根据请求自动通过电子邮件发送的唯一推介网址时为用户选择新密码。

(非常基本的安全性)。

修改

我将解释为什么你需要盐。假设有人破坏了您的数据库,并且user表包含simple(例如MD5)密码哈希值。他(或她)现在可以使用简单的密码组合(例如select * from users where pw_hash = ...)简单地对整个表启动字典攻击。如果你使用随机生成的(但存储的)盐来密码散列,那么这种暴力破解攻击会更难以利用。

答案 1 :(得分:3)

首先要理解的是crypt()的作用。首先阅读:http://php.net/manual/en/function.crypt.php

本质上,crypt()是一个散列函数。更确切地说,它是单向散列函数。因此,您无法从中恢复密码。

在当今世界,当用户“忘记”他们的密码时,最好的处理方式是创建一个新密码,存储并通过电子邮件发送给他们。

通过这样做,您确保如果他们为多个服务使用相同的密码,您不会无意中将这些其他服务暴露给邪恶的人。其次,如果不是原始用户请求密码,下次他们尝试登录时他们会注意到他们的密码不再有效。

答案 2 :(得分:2)

查看my answer相关问题。


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

散列(在你的情况下)是按照这个原则运作的:

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.

您还可以使用 salt 来提高哈希的安全性。同样的原则也适用:

if hash(session.password + 'imasalt') == database.hashed_password_with_salt:
   # Same as above.

答案 3 :(得分:1)

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

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

看一下mcrypt http://php.net/manual/en/book.mcrypt.php

答案 4 :(得分:1)

你没有。如果他们忘记了密码,您应该重置密码并向他们发送电子邮件以创建新密码或其他内容。以某种方式存储密码意味着它们可以被解密和检索是非常不安全的,并且在某些国家可能是非法的(我不是律师)。