如果我理解正确,通过电子邮件发送密码的最大问题是它需要将密码以明文形式存储在数据库中。如果数据库遭到入侵,攻击者将获得对所有帐户的访问权限。
这个问题有解决方法吗?
如何通过电子邮件尽可能安全地向用户发送密码?
答案 0 :(得分:3)
简单的答案是:不要。如果您认为您的数据库不安全,那么电子邮件远远不够。
如果您的意思是在注册时要向他们发送密码,那么您可以在将密码存储到数据库之前执行此操作。
如果您的意思是他们已经注册,唯一的选择是以明文(再次,不要这样做)存储或创建一个新的随机密码并发送它们。从哈希中获取密码是不可能的,这就是为什么它使密码存储更安全。最好的选择是生成一个新的(临时)密码,或者一个令牌,让他们可以访问密码更改系统。
您可能需要考虑像BCrypt这样包含盐的良好散列算法。
答案 1 :(得分:0)
您应该对数据库中的所有密码进行哈希处理。
sha1($_POST['password'].$salt.$username);
用户请求密码重置链接,该链接包含在“user_meta”表中生成的哈希。当用户收到此链接时,将哈希值与数据库中的哈希值进行比较,用户将能够使用新密码更新其当前密码。
密码的PTXT 从不显示。
您只比较哈希。
答案 2 :(得分:0)
当密码在电子邮件中以明文形式出现时,它本身就是不安全的。
因此,无法安全地以明文形式发送密码。
您不应该在数据库中以明文形式存储密码 - 您应该使用盐渍哈希。当用户输入密码时,您使用salt对其进行散列并与存储的散列进行比较。
当人们忘记密码而不是通过电子邮件发送密码时,您应该发送由到期令牌备份的重置链接。这些将生成一个临时的新密码(将在几分钟内到期)。
答案 3 :(得分:0)
我不知道我的建议是否适用于您的方案,但您最好保持数据经过哈希或加密,并发送密码重置链接而不是纯文本密码。
答案 4 :(得分:0)
是的,有一个共同的解决方法。
假设您的数据库中有用户。
您发送包含一些“密钥”信息的“密码重置链接”,例如guid。一个示例链接是一个表单:
http://your.site.com/setpassword?id=5b070092-4be8-4f4d-9952-1b915837d10f
在您的数据库中,您可以存储已发送的guid和电子邮件之间的映射。
当有人打开你的链接时,你检查你的数据库,你可以找出谁要求页面 - 因为任何有效的guid映射到电子邮件。然后,您可以安全地让用户更改他/她的密码,假设他们的电子邮件没有受到损害。
当它即将存储密码时,你从不以纯文本形式存储它,你总是使用额外的随机盐来密码,当有人闯入你的数据库时,使字典攻击变得更加困难。 / p>
答案 5 :(得分:0)
有一种解决方法不如密码重置安全,但如果要求用户发送密码而不是重置链接,则可以使用。
你所做的是你生成一个包含足够随机性的新密码,这个密码很难猜测,但其格式也很容易记住和读出(比如通过电话)。
类似于: xyz - xyz - xyz - nnnn 其中 xyz 是一个容易拼写但不常见的单词,而 nnnn 是一个四位数字。
然后进行设置,以便这是一个临时密码,需要在首次登录时更改。
使用与设置普通密码相同的逻辑设置密码,使其正确加盐和散列,然后通过电子邮件发送密码明文,如上所述。
亲爱的FirstName LastName,
您要求我们重置您的密码。
您的新密码是:
insipid-mirth-nonplus-9174
您可以使用此密码登录系统,然后您需要输入新密码。
该系统存在一些严重的漏洞,使其不适合数据安全至关重要的网站。还有更多,但这些是我知道/可以想到的:
答案 6 :(得分:-3)
如果您想通过电子邮件以明文形式向用户发送密码,并希望将这些密码以哈希或任何其他格式存储到数据库中。有可能.......
只是你必须按照一些简单的方式......
1.您必须将这些密码作为将从用户发送的变量
2.存储数据库时,只需按照您希望的格式进行转换即可。
但是当你通过邮件发送给用户时,那个时候只发送了那些可变密码......
我认为建立关于WAY的概念会很有帮助.......