在PHP中编码密码的最佳方法

Jas*_*vis 14 php passwords

我目前使用
base64_encode()来编码用户的密码,这很好用,因为它允许我简单地使用base64decode()来解密一个单词的密码,如果他们丢失密码就发送给那里的电子邮件.

我一直在阅读密码,很多人似乎都说你应该使用sha1()来编码密码.我全都是为了提高系统的安全性但是如果我转换为使用shal()那么我将无法向用户发送丢失的密码.

你用什么?你能给我一些建议吗?有没有办法解密可读密码来通过电子邮件发送给用户?

当我输入这个问题时,我只是记得有些论坛在请求时没有给你发密码,而是发送一个特殊的链接来重新设置你的密码,我猜这是因为他们无法解密你的密码?

//what I use now
$password_encoded = base64_encode($password);

//what I am considering using
$password_encoded = sha1($password);
Run Code Online (Sandbox Code Playgroud)

Rex*_*x M 43

请为了您的用户请不要以任何可逆的格式存储他们的密码!它是Base64编码还是三重DES 168位加密并不重要- 如果它是可逆的,它就像你根本不编码一样安全.

没有任何网站有兴趣保护自己或其用户(或有舔感)将通过电子邮件向用户发送密码.我们唯一能做的就是远程接近安全,就是向用户发送一封电子邮件,其中包含一个独特的一次性链接,可以让他们设置一个新密码.

  • 存储已加盐的密码的哈希值(bcryptPBKDF2)
  • 一旦您将其密码丢失,请丢弃原始密码.从内存中删除它.
  • 始终要求用户通过SSL通道创建自己的新密码

试图与其他任何东西相处只是疏忽.让我们使用安全讨论中常用的场景:

用户Frederic的电子邮件遭到入侵.这可能是因为他的计算机已解锁或使用弱密码.无论如何,未经授权的人都可以访问他的消息.理想情况下,这只不过是陌生人阅读的一些令人尴尬的情书.不幸的是,未经授权的人发现论坛将以纯文本形式向Frederic的密码发送电子邮件.与大多数用户一样,Frederic对所有内容使用相同的密码,包括他的网上银行.他的用户名列在他银行的电子邮件中.现在情况非常不幸.

用户在与您建立基于凭据的关系时会信任您.这种信任的一部分是你将这些凭证作为你和他们之间的安全秘密.

有关

在SO上,很多周围的问题和想法得到了很好的回答:

  • 默默无闻的@ d03boy安全性与完全无安全性相同.在像网站这样的独立系统中,必须存在反转数据的所有必要部分,无论多么混淆.因此,如果攻击者获得对系统的访问权限,则攻击者可以访问所有部分. (6认同)

Ben*_*n S 10

作为管理员,您实际上不需要回忆用户的密码.您只需要知道他们曾经提交过的字符串是否与另一个字符串相同.

如果用户忘记了密码,则无需告知他们的旧密码,只需让他们提供新密码即可.

由于您不需要知道实际的密码,因此使用单词的加密哈希似乎是一种安全存储方式.但是,已经制作了大量预先计算的字符串表,可以轻松地对其原始字符串进行反向查找.这些被称为彩虹表.

为了避免预先计算的字符串容易查找,您应该哈希之前您的密码.salt可以是他们的用户名前缀,或者他们的用户ID后缀,无论您对用户的额外信息是永久性的,您可以在身份验证期间轻松添加到密码.

  • @jasondavis哈希,不加密 (3认同)

Joe*_*ips 6

您应该让用户重置密码,但永远不要检索他们的密码.这就是为什么你想要使用单向散列(SHA2)而不是一种允许你解码它的加密形式.

想象一下,如果你打开你的电子邮件.我可以简单地请求检索一些网站的密码,删除电子邮件,你永远不会知道.另一方面,如果您要求我重置密码,帐户密码将会改变,并且所有者显然会意识到出现了问题.(这是一个愚蠢的场景,但这个概念很重要)

通过尝试所有可能的单词组合(或使用彩虹表),可以"反转"散列,直到生成匹配的散列.避免这种情况的一种方法是使用salt附加/前置提供的密码,使其成为一个非常长且不可预测的字符串.salt应该是个人帐户唯一的唯一数据字符串.

在PHP中没有SHA2功能.SHA-2是一系列哈希算法,(SHA-256,SHA-384,SHA-512等......)

hash('sha256', 'The quick brown fox jumped over the lazy dog.');
Run Code Online (Sandbox Code Playgroud)


Gre*_*ill 5

绝对必须阅读这个主题是杰夫自己的错误地存储密码.这是执行摘要:

  1. 不要发明自己的"聪明"密码存储方案.
  2. 切勿将密码存储为纯文本.
  3. 为您存储的每个密码添加一个长而独特的随机盐.
  4. 使用加密安全散列.