用PHP编码密码的最佳方法

用PHP编码密码的最佳方法,php,passwords,Php,Passwords,我目前使用, base64\u encode()要对用户的密码进行编码,这很有效,因为它允许我简单地使用base64解码()将密码解码为一个单词,并在他们丢失密码时向他们发送电子邮件 不过,我一直在阅读密码,很多人似乎都说应该使用sha1()对密码进行编码。我完全支持提高系统的安全性,但如果我转换为使用shal(),则我将无法向丢失密码的用户发送密码 你用什么?你能给我一些建议吗?有没有一种方法可以将可读密码解码为电子邮件发送给用户 当我输入这个问题时,我记得一些论坛在被请求时不会向你发送密码,

我目前使用,
base64\u encode()要对用户的密码进行编码,这很有效,因为它允许我简单地使用base64解码()将密码解码为一个单词,并在他们丢失密码时向他们发送电子邮件

不过,我一直在阅读密码,很多人似乎都说应该使用sha1()对密码进行编码。我完全支持提高系统的安全性,但如果我转换为使用shal(),则我将无法向丢失密码的用户发送密码

你用什么?你能给我一些建议吗?有没有一种方法可以将可读密码解码为电子邮件发送给用户

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

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

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

为了您的用户,请不要以任何可逆格式存储他们的密码!不管它是Base64编码的还是-如果它是可逆的,它的安全性就如同您根本没有对它进行编码一样

任何对保护自己或用户(或有点常识的)感兴趣的网站都不会通过电子邮件向用户发送密码。我们所能做的唯一一件事,甚至是远程接近安全的,就是向用户发送一封带有唯一一次性链接的电子邮件,让他们设置一个新密码

  • 存储已删除的密码的哈希(或)
  • 一旦对原始密码进行哈希运算,就将其丢弃。从记忆中删除它
  • 始终要求用户通过SSL通道创建自己的新密码
老实说,试图应付任何其他事情只是疏忽。让我们使用安全讨论中使用的一个非常常见的场景:

用户Frederic的电子邮件被泄露。这可能是因为他的电脑没有上锁或使用了弱密码。无论如何,未经授权的人可以访问他的消息。理想情况下,这只意味着陌生人读一些令人尴尬的情书。不幸的是,未经授权的人发现论坛将以明文形式发送Frederic密码的电子邮件。和大多数用户一样,Frederic对所有东西都使用相同的密码,包括他的网上银行。他的用户名列在银行的电子邮件中。现在的情况非常不幸

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

相关的

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


您应该允许用户重置密码,但决不能检索其密码。这就是为什么您希望使用单向散列(SHA2)而不是允许您解码它的加密形式

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

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

在PHP中没有SHA2函数。SHA-2是一系列散列算法(SHA-256、SHA-384、SHA-512等)


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

如果用户忘记了密码,不需要告诉他们旧密码,您只需让他们提供一个新密码即可

因为您不需要知道实际的密码,所以使用一组单词似乎是一种安全的存储方式。然而,预先计算的字符串的大型表已经制作好,可以轻松地对哈希进行反向查找,使其返回到原始字符串。这些被称为


为了避免容易查找预先计算的字符串,在对密码进行哈希运算之前,应先检查密码。salt可以是他们的用户名前缀,也可以是他们的用户ID后缀,无论你在用户身上拥有什么永久性的额外信息,都可以在身份验证过程中轻松添加到密码中。

Base64Encode提供安全性,因为任何人都可以轻松撤销它

如果您确实需要反转密码,一个好方法是使用一个秘密问题,并将答案用作加密密钥。一旦密码被加密,你就把答案扔掉了(你不存储它)。当您需要验证他输入的密码是否正确时,您还可以使用标准sha1加密。如果用户想要它的密码,他就输入它的秘密问题的答案,然后你用它来恢复密码并将它发送给他

它不像基于散列的加密那样安全,但是如果你需要发回密码,这是一个很好的折衷方案


您可能想查看用于php的mcrypt库

我总是只删除我的帐户,任何发送电子邮件给我密码的网站都是如此。我花了太多的精力和时间去记忆长的随机密码,而没有把它以纯文本的形式发送给我

使用sha1()或更高的不可逆散列来标识密码。验证用户密码时,检索哈希值,并将其与验证期间提供的密码哈希值进行比较。如果它们匹配,则用户在合理标准内是真实的

$user = "joe";
$password = 'password';

$saved_hash = DB::Query("select hash from users where username = ".quote($user)." LIMIT 1");

if (sha256($password) == $saved_hash) User::authenticated();
永远不要在电子邮件中发送密码。
$user = "joe";
$password = 'password';

$saved_hash = DB::Query("select hash from users where username = ".quote($user)." LIMIT 1");

if (sha256($password) == $saved_hash) User::authenticated();
$key = sha256(time().rand().$secret_seed);
SELECT * FROM user WHERE password = MD5(CONCAT(?, salt));