Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Passwords 是否有一种安全的方式通过电子邮件以明文形式向用户发送密码?_Passwords_Password Protection_Forgot Password_Password Storage - Fatal编程技术网

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

Passwords 是否有一种安全的方式通过电子邮件以明文形式向用户发送密码?,passwords,password-protection,forgot-password,password-storage,Passwords,Password Protection,Forgot Password,Password Storage,如果我理解正确的话,通过电子邮件发送密码的最大问题是需要将密码以明文形式存储在数据库中。如果数据库受损,攻击者将获得对所有帐户的访问权 这个问题有解决办法吗 如何使通过电子邮件向用户发送密码尽可能安全?您应该对数据库中的所有密码进行哈希运算 sha1($_POST['password'].$salt.$username); 在密码丢失的情况下 用户请求密码重置链接,该链接包含在“user_meta”表中生成的哈希。当用户收到此链接时,将哈希值与数据库中的哈希值进行比较,用户将能够使用新密码更新

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

这个问题有解决办法吗


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

您应该对数据库中的所有密码进行哈希运算

sha1($_POST['password'].$salt.$username);
在密码丢失的情况下 用户请求密码重置链接,该链接包含在“user_meta”表中生成的哈希。当用户收到此链接时,将哈希值与数据库中的哈希值进行比较,用户将能够使用新密码更新其当前密码

密码的PTXT是从不释放的


您只比较散列。

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

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

您不应该在数据库中以明文形式存储密码-您应该使用salted散列。当用户输入密码时,您可以使用salt对其进行散列,并与存储的散列进行比较


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

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

如果您的意思是希望在他们注册时向他们发送密码,那么您可以在将密码存储到数据库之前发送密码

sha1($_POST['password'].$salt.$username);
如果你的意思是在他们注册后,唯一的选择是以明文存储(同样,不要这样做)或创建一个新的随机密码并发送给他们。从散列中获取密码是不可能的,这就是为什么它使密码存储更安全的原因。最好的选择是生成您发送给他们的新(临时)密码,或者生成允许他们访问密码更改系统的令牌


你可能想考虑一个很好的哈希算法,比如一个AULL。< /P> < P>我不知道我的建议是否适合你的场景,但是你最好还是保持数据散列或加密,然后发送“强>密码重置链接

是的,有一个常见的解决方案。p> 假设数据库中有用户

sha1($_POST['password'].$salt.$username);
您发送包含一些“密钥”信息的“密码重置链接”,如guid。示例链接是一个表单:

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

当有人打开你的链接时,你检查你的数据库,你可以找到谁需要这个页面——因为任何有效的guid都会映射到一封电子邮件。然后,您可以安全地让用户更改其密码,前提是他们的电子邮件未被泄露


当它要存储密码时,您从不将其存储为纯文本,您总是散列密码,当有人闯入您的数据库时,使用额外的随机salt使字典攻击更加困难。

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

sha1($_POST['password'].$salt.$username);
只是你必须遵循一些简单的方法

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


我认为这将有助于建立您关于……方式的概念

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

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

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

然后设置它,使其成为第一次登录时需要更改的临时密码

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

亲爱的姓

您请求我们重置您的密码

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

您将能够使用此密码登录系统,然后需要输入新密码

重要注意事项 该系统存在一些严重漏洞,不适用于数据安全至关重要的网站。不止这些,但这些是我知道/能想到的:

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