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

我目前使用,
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位加密都无所谓 - 如果它是可逆的,它就像您完全不编码一样安全

没有对保护自己或其用户有任何兴趣的网站(或者有一些理智)会通过电子邮件向用户发送密码。 我们唯一能够做到的,即使是远距离接近安全的做法也是向用户发送一封带有一次性使用的唯一链接的电子邮件,以便他们设置一个新密码。

  • 存储已被盐渍的密码的散列(bcrypt或PBKDF2)
  • 一旦散列它就扔掉原始密码。 从记忆中消除它。
  • 始终要求用户通过SSL通道创建自己的新密码
  • 试图与其他任何事情相处只是疏忽而已。 让我们使用安全性讨论中使用的一个非常常见的方案:

    用户Frederic的电子邮件已被泄露。 这可能是因为他的电脑未锁定或使用弱密码。 无论如何,未经授权的人都可以访问他的消息。 理想情况下,这只不过是陌生人读到的一些尴尬的情书。 不幸的是,未经授权的人发现论坛将以纯文本形式向Frederic的密码发送电子邮件。 与大多数用户一样,Frederic对所有内容都使用相同的密码,包括他的在线银行。 他的用户名在他银行的电子邮件中列出。 现在情况很不好。

    用户在与您创建基于证书的关系时会对您产生信任。 这种信任的一部分是,你将保留这些证书作为你和他们之间的安全秘密。

    有关

    因此,很多周围的问题和想法都得到了很好的回答:

  • 散列密码和加密之间的区别
  • 为什么挑战 - 应对方法对于忘记密码而言是一个糟糕的解决方案
  • 用于密码哈希的非随机盐

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

    如果用户忘记密码,他们不需要被告知他们的旧密码,您可以简单地让他们提供一个新的密码。

    由于您不需要知道实际的密码,因此使用这些词的加密散列似乎是一种安全的方式来存储它们。 但是,预先计算的大型字符串表可以很容易地对散列进行反向查找,并将其恢复为原始字符串。 这些被称为彩虹桌。

    为了避免容易查找预先计算的字符串,您应该先对密码进行哈希处理。 salt可以是用户名前缀,或者用户ID后缀,无论您对用户拥有哪些永久性信息,都可以在验证期间轻松添加到密码中。


    您应该让用户重置密码,但不要回收密码。 这就是为什么你想要使用单向散列(SHA2),而不是使用可以解码的加密形式。

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

    哈希可以通过尝试所有可能的单词组合(或使用彩虹表)来“颠倒”,直到产生匹配的哈希。 避免这种情况的一种方法是在salt中附加/提前提供密码,以使其成为一个非常长且不可预知的字符串。 salt应该是个人帐户唯一的唯一数据字符串。

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

    hash('sha256', 'The quick brown fox jumped over the lazy dog.');
    
    链接地址: http://www.djcxy.com/p/21849.html

    上一篇: Best way to encode passwords in PHP

    下一篇: Xcode salting and hashing a password