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

2022-08-30 23:54:03

我目前使用,
base64_encode()来编码用户的密码,这很好用,因为它允许我简单地使用base64decode()将密码解码为单词,并在丢失密码时发送电子邮件。

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

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

当我输入这个问题时,我只是回忆说,有些论坛在请求时不会向您发送密码,而是发送一个特殊链接来重新设置您的密码,我猜这是因为他们无法解码您的密码也许?

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

//what I am considering using
$password_encoded = sha1($password);

答案 1

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

任何有兴趣保护自己或其用户(或具有一丝意义)的网站都不会通过电子邮件向用户发送密码。我们唯一能做的,甚至远程接近安全的事情就是向用户发送一封电子邮件,其中包含唯一的一次性链接,让他们设置新密码。

  • 存储已加盐的密码的哈希值(bcryptPBKDF2
  • 一旦您对原始密码进行了哈希处理,就将其丢弃。将其从内存中切除。
  • 始终要求用户通过 SSL 通道创建自己的新密码

老实说,试图靠其他任何事情过日子都只是疏忽。让我们使用安全讨论中使用的一个非常常见的场景:

用户Frederic的电子邮件已泄露。这可能是由于将计算机解锁或使用弱密码。无论如何,未经授权的人可以访问他的消息。理想情况下,这只意味着一个陌生人读的一些令人尴尬的情书。不幸的是,未经授权的人发现论坛将以纯文本形式通过电子邮件发送Frederic的密码。像大多数用户一样,弗雷德里克对所有事情都使用相同的密码,包括他的网上银行。他的用户名列在他的银行的电子邮件中。现在的情况非常不幸。

当用户与您建立基于凭据的关系时,他们信任您。这种信任的一部分是,您将保留这些凭据作为您与他们之间的安全秘密。

相关

许多围绕的问题和想法在SO上都得到了很好的回答:


答案 2

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

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

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

为了避免轻松查找预先计算的字符串,您应该在对密码进行哈希处理之前对其进行加盐。盐可以是他们的用户名前缀,也可以是他们的用户ID后缀,您在用户身上的任何额外信息都是永久性的,您可以在身份验证期间轻松将其添加到密码中。


推荐