php - 在 PHP 中编码密码的最佳方式

标签 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);

最佳答案

为了您的用户,请不要以任何可逆格式存储他们的密码!不管是 Base64 编码还是 triple-DES 168-bit encryption - 如果它是可逆的,它就和你根本没有编码一样安全

没有有兴趣保护自己或其用户(或有一点感觉)的网站会通过电子邮件向用户发送密码。我们唯一能做的甚至离安全还很遥远的事情就是向用户发送一封电子邮件,其中包含一个唯一的、一次性使用的链接,让他们可以设置一个新密码。

  • 存储密码的散列值(bcryptPBKDF2)salted
  • 散列后立即丢弃原始密码。从内存中删除它。
  • 始终要求用户通过 SSL channel 创建自己的新密码

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

用户 Frederic 的电子邮件被泄露。这可能是因为他的计算机未锁定或使用了弱密码。无论如何,未经授权的人可以访问他的消息。理想情况下,这只不过是一些陌生人读到的令人尴尬的情书。不幸的是,未经授权的人发现论坛将以明文形式通过电子邮件发送 Frederic 的密码。与大多数用户一样,弗雷德里克对所有事情都使用相同的密码,包括他的网上银行业务。他的用户名列在他银行的一封电子邮件中。现在情况很不幸。

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

Related

A lot of the surrounding issues and ideas have been answered very well on SO:

关于php - 在 PHP 中编码密码的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1391613/

相关文章:

objective-c - 将 cocoa 应用程序密码保存在字符串中

带有 truecrypt 密码隐藏的 Linux bash shell 脚本

c# - 在 session 中存储散列密码是不可取的吗?

php - Guzzle ~6.0 多部分和 form_params

php - Laravel 5.2 在 Handler.php 第 103 行抛出 NotFoundHttpException

php - 重新加载表格而不刷新php中的整个页面

php - 更新 'pass and confirm' 表单的字段

php - undefined offset : 0 error when using inval() converted indexes

PHP:像linux一样转义文件名

database - 用户详细信息表中的用户身份验证详细信息还是单独的?