4

如果我理解正确,通过电子邮件发送密码的最大问题是它要求密码以明文形式存储在数据库中。如果数据库遭到破坏,攻击者将获得对所有帐户的访问权限。

有解决此问题的方法吗?

如何尽可能安全地通过电子邮件向用户发送密码?

4

7 回答 7

3

简单的答案是:不要。如果您认为您的数据库不安全,那么电子邮件就远非如此。

如果您的意思是要在他们注册时向他们发送密码,那么您可以在将其存储到数据库之前执行此操作。

如果您的意思是在他们注册后,唯一的选择是以明文存储(同样,不要这样做)或创建一个新的随机密码并将其发送给他们。从哈希中获取他们的密码是不可能的,这就是它使密码存储更安全的原因。最好的选择是生成一个您发送给他们的新(临时)密码,或者一个让他们访问密码更改系统的令牌。

您可能需要考虑一个很好的散列算法,例如包含盐的BCrypt 。

于 2012-02-25T20:02:51.870 回答
1

我不知道我的建议是否适用于您的方案,但您最好保持数据散列或加密,并发送密码重置链接而不是纯文本密码。

于 2012-02-25T20:04:45.993 回答
0

您应该对数据库中的所有密码进行哈希处理。

sha1($_POST['password'].$salt.$username);

在丢失密码的情况下

用户请求密码重置链接,其中包含在“user_meta”表中生成的哈希。当用户收到此链接时,会将哈希值与数据库中的哈希值进行比较,用户将能够使用新密码更新其当前密码。

密码的 PTXT永远不会被泄露。

你只比较哈希。

于 2012-02-25T20:01:01.997 回答
0

当密码在电子邮件中以明文形式出现时,它本质上是不安全的。

因此,没有安全的方法可以安全地以明文形式发送密码。

您不应该在数据库中以明文形式存储密码 - 您应该使用加盐哈希。当用户输入他们的密码时,你用盐对其进行哈希处理并与存储的哈希值进行比较。

当人们忘记密码时,您应该发送由过期令牌备份的重置链接,而不是通过电子邮件发送密码。这些将生成一个临时的新密码(将在几分钟内到期)。

于 2012-02-25T20:01:04.013 回答
0

是的,有一个常见的解决方法。

假设您的数据库中有用户。

您发送包含一些“关键”信息的“密码重置链接”,例如 guid。一个示例链接是一个表单:

http://your.site.com/setpassword?id=5b070092-4be8-4f4d-9952-1b915837d10f

在您的数据库中,您存储发送的 guid 和电子邮件之间的映射。

当有人打开您的链接时,您检查您的数据库,您可以找出谁在请求该页面 - 因为任何有效的 guid 都映射到电子邮件。然后,您可以安全地让用户更改他/她的密码,前提是他们的电子邮件没有被泄露。

当它要存储密码时,你永远不会以纯文本形式存储它,你总是对密码进行哈希处理,当有人闯入你的数据库时,使用额外的随机盐来使字典攻击更加困难。

于 2012-02-25T20:07:03.223 回答
0

有一种解决方法比密码重置安全性低,但如果需要向用户发送密码而不是重置链接,则可以使用。

您所做的是生成一个新密码,该密码包含足够的随机性,很难猜到,但其格式也很容易让他们记住和读出(比如通过电话)。

类似于:xyz - xyz - xyz - nnnn其中xyz是一个易于拼写但不常见的单词,而nnnn是一个四位数。

然后设置它,以便这是一个临时密码,需要在第一次登录时更改。

使用与设置普通密码相同的逻辑设置密码,以便正确加盐和散列,然后通过电子邮件发送密码明文,如下所示。

亲爱的名字姓氏,

您要求我们重置您的密码。

您的新密码是:
insipid-mirth-nonplus-9174

使用此密码即可登录系统,然后需要输入新密码。

重要注意事项

该系统存在一些严重的漏洞,使其不适用于数据安全至关重要的网站。还有更多,但这些是我知道/能想到的:

  1. 与使用密码重置链接的系统不同,该系统可用于将某人锁定在系统之外(假设您按原样使用它),除非您要求某人在发出密码重置之前填写可识别信息,或发送“是你确定要重设密码吗?” 先发邮件。这将需要他们单击带有 GUID 的链接,该链接将进入服务器;到那时,它们也可能会被发送到密码重置表单。
  2. 由于密码是通过电子邮件以纯文本形式发送的,因此存在被截获并且可以使用密码的危险。虽然公平地说,这与发送密码重置链接的风险并没有太大区别。
  3. 如果您忽略第 1 步中的风险,并且您没有使用足够随机的方式生成密码(例如,您使用少于 1000 项的单词列表),那么入侵您服务器的人将能够检索到 salted密码哈希,然后编写一个算法来生成所有可能的密码,并根据哈希密码检查它们。如果您使用密码学上复杂的散列算法,则问题不大。
于 2015-02-03T15:34:50.550 回答
-3

如果您想通过电子邮件以明文形式向用户发送密码,并希望将这些密码以哈希或任何其他格式存储到数据库中。这将是可能的......

只是你必须遵循一些简单的方法....

1 .您必须将这些密码作为变量从用户发送。
2.当您存储数据库时,只需将其转换为您希望的格式。
3.但是当你通过邮件将那些发送给用户时,那个时候只是发送了那些可变密码......

我认为这将有助于建立您对 WAY 的概念......

于 2012-02-25T20:17:39.440 回答