我目前使用,
BASE64_ENCODE()来编码用户的密码,这个效果很好,因为它让我简单地使用base64decode()的密码解码为字和发送到电子邮件那里,如果他们失去存在的密码。
我已经在密码虽然读了,很多人好像说,你应该使用SHA1()来编码密码。 我完全支持我的提高系统的安全性,但如果我转换使用SHAL(),那么我将无法向用户发送有丢失的密码。
你用什么? 你能给我一些建议吗? 而且是有办法DECOD为可读密码以电子邮件用户?
由于我打字这个问题,我只是remebered被请求时,一些论坛不给你一个密码,而是发送一个特殊的链接重新设置自己的密码,我猜测,这是因为他们无法解码,也许你的密码?
//what I use now
$password_encoded = base64_encode($password);
//what I am considering using
$password_encoded = sha1($password);
Answer 1:
请你,请为您的用户着想不要他们的密码存储在任何可逆格式! 没关系,如果它的Base64编码或三重DES 168位加密 - 如果它是可逆的,这是完全一样的安全,因为如果你没有编码,它在所有 。
没有网站,在保护自身或其用户任何权益(或有意识舔)会通过电子邮件向用户发送他们的密码。 我们可以这样做的唯一的事情甚至远程关闭,以确保是向用户发送了一个独特的,一次性使用的链接,可以让他们设置新密码的电子邮件。
- 存储哈希( bcrypt或PBKDF2已密码) 盐渍
- 只要你散列它扔掉原来的密码。 从内存切除它。
- 总是要求用户通过SSL通道来创造自己的新密码
试图用别的度日是诚实只是疏忽。 让我们使用中的安全性讨论用了一个很常见的场景:
弗雷德里克用户的电子邮件被泄露。 这可能是离开他的计算机解锁或使用弱密码。 无论如何,未经授权的人访问他的消息。 理想情况下,这将意味着什么比一个陌生人看了一些令人尴尬的情书了。 不幸的是,未经授权的人发现了一个论坛,会以纯文本电子邮件弗雷德里克的密码。 大多数用户一样,弗雷德里克使用相同的密码的一切,包括他的网上银行。 他的用户名被列在从他的银行的电子邮件。 现在的情况是非常不幸的。
用户正在把对你的信任,当他们创建您在基于凭据关系。 这种信任的部分原因是,你能不能让这些凭据,你和他们之间的安全加密。
有关
很多周围的问题和想法已经回答了很好的SO:
- 散列密码和加密它的区别
- 为什么挑战-响应方法为忘记密码而一个贫穷的解决方案吗?
- 密码哈希的非随机盐
Answer 2:
作为管理员, 你从来没有真正需要召回的用户的密码 。 你只需要知道,如果他们一旦提交一个字符串,等同于另一个。
如果用户忘记了自己的密码,他们并不需要被告知他们的旧密码,你可以简单地让它们提供了一个新的。
既然你不需要知道实际的密码,使用crytographic哈希的话会像保存一个安全的方式。 然而,已经预先计算字符串的大表很容易做哈希的反向查找回它的原始字符串。 这些被称为彩虹表 。
为了避免预先计算的字符串容易查找,您应该盐哈希之前您的密码。 盐可以是他们的用户名前缀,或他们的用户ID后缀,你对此是永久性的,你可以轻松地验证过程中添加到密码的用户的任何额外信息。
Answer 3:
你应该让用户重置密码,但从来没有找回自己的密码。 这就是为什么你会想用一个单向散列(SHA2),而不是一种形式的加密,可以让你解码。
试想一下,如果你离开你的电子邮件打开。 我可以简单地要求为某些网站上检索您的密码,删除电子邮件,你永远不会知道。 在另一方面,如果你需要我重新设置密码,而不是,帐户密码会改变和业主显然认识到,什么是错的。 (这是一个愚蠢的方案,但这个概念是什么是重要的)
通过尝试字的所有可能的组合(或使用彩虹表),直到匹配的散列产生哈希可以“反向”。 避免这种情况的一种方法是附加/前面加上盐所提供的密码,以使它成为一个很长的和不可预知的字符串。 盐应该是唯一的个人帐户数据的唯一字符串。
在PHP中没有SHA2 functon。 SHA-2是哈希算法家族,(SHA-256,SHA-384,SHA-512,等等)
hash('sha256', 'The quick brown fox jumped over the lazy dog.');
Answer 4:
绝对不容阅读关于这个主题是杰夫自己的错误,你可能储存密码 。 以下是内容提要:
- 不要发明自己的“聪明”的密码存储方案。
- 切勿将密码明文。
- 长,唯一的随机盐添加到您存储每个密码。
- 使用加密的安全散列。
Answer 5:
Base64Encode 不提供安全性,因为任何人都可以轻松地扭转这种局面。
如果你绝对需要扭转的密码,一个好的办法是使用一个秘密的问题,并使用答案的加密密钥。 一旦密码被加密,你把答案远(你没有保存它)。 您还可以使用标准的SHA1加密的时候,你需要验证他输入正确的密码。 如果用户想要的密码,他进入回答其秘密问题,你用它来恢复密码,并将其发送回给他。
它并不像基于散列加密仅作为安全的,但如果你需要发回密码这是一个很好的妥协。
你可能想看看PHP的mcrypt的库http://ca3.php.net/mcrypt
Answer 6:
我总是删除我的帐户仅任何网站,电子邮件,我的密码。 我把太多的精力和时间为记住冗长的随机密码将它以纯文本形式发送给我。
使用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();
永远不要发送密码的电子邮件。 发送一个独特的,不可预测的,生成的密钥,比如在PHP中:
$key = sha256(time().rand().$secret_seed);
发送此项的客户端,为一次性使用,设置新的密码。
Answer 7:
Answer 8:
在一个快速查询验证时,您可以做散列在服务器上:
SELECT * FROM user WHERE password = MD5(CONCAT(?, salt));
文章来源: Best way to encode passwords in PHP