有没有一种安全的方式通过电子邮件以明文形式向用户发送密码?

Posted

技术标签:

【中文标题】有没有一种安全的方式通过电子邮件以明文形式向用户发送密码?【英文标题】:Is there a safe way to send a user their password in clear text via email? 【发布时间】:2012-03-15 21:27:42 【问题描述】:

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

是否有解决此问题的方法?

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

【问题讨论】:

简单地说:“不”。由于您提到的原因也因为人们在多个站点上使用相同的密码,所以将密码明文存储是不好的。通常它以一种方式加密存储,因此即使管理员也看不到它,只需更改它即可。只是不好的做法。 为什么要向用户发送密码? 在数据库中以明文形式存储密码是不好的,通过电子邮件发送密码更糟糕。加密您的数据库并告诉用户使用忘记的密码,为他们提供您选择的新密码,然后他们可以使用该密码登录并将密码更改回他们想要的密码。 为什么不直接向用户发送一个新密码,他们必须在第一次登录时更改。大多数网站都是这样做的。 【参考方案1】:

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

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

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

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

【讨论】:

【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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

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

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

【讨论】:

【参考方案4】:

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

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

在丢失密码的情况下

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

密码的 PTXT从不公开。

您只比较哈希值。

【讨论】:

【参考方案5】:

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

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

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

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

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

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

当它要存储密码时,你从不以纯文本形式存储它,你总是散列密码,使用额外的随机盐来使字典攻击更加困难,当有人闯入你的数据库时。

【讨论】:

【参考方案6】:

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

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

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

然后将其设置为临时密码,首次登录时需要更改。

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

亲爱的名字姓氏,

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

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

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

重要提示

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

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

【讨论】:

【参考方案7】:

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

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

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

我认为这将有助于你建立关于 WAY 的概念......

【讨论】:

以上是关于有没有一种安全的方式通过电子邮件以明文形式向用户发送密码?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP协议冷知识大全

HTTP - 摘要认证

Asp.Net Identity 2 无法重置密码明文?

前端学HTTP之摘要认证

openssh网络安全分析

通过 PHP 向许多用户发送邮件的安全方式