Php 什么是双向处理密码的好选择?

Php 什么是双向处理密码的好选择?,php,security,Php,Security,我计划使用Kohana的加密类,但是否有更好、更安全的方法进行双向处理?我希望我的用户能够发送他们以前密码的请求,而不是给他们重置密码 你能推荐什么算法或库吗?特别是在PHP中?双向加密不是一种可行的方法,因为无论谁持有服务器的密钥,基本上都可以访问所有密码。这意味着如果你有一个不满的员工或管理员,他们可能会带走你所有的用户帐户数据。另外,您将如何保护所需的密钥?当您向用户提供密码时,如何确保站点和用户之间的通信安全。我的建议是不要去那里。我不会做双向加密。这基本上没有加密,因为您需要访问代码中

我计划使用Kohana的加密类,但是否有更好、更安全的方法进行双向处理?我希望我的用户能够发送他们以前密码的请求,而不是给他们重置密码


你能推荐什么算法或库吗?特别是在PHP中?

双向加密不是一种可行的方法,因为无论谁持有服务器的密钥,基本上都可以访问所有密码。这意味着如果你有一个不满的员工或管理员,他们可能会带走你所有的用户帐户数据。另外,您将如何保护所需的密钥?当您向用户提供密码时,如何确保站点和用户之间的通信安全。我的建议是不要去那里。

我不会做双向加密。这基本上没有加密,因为您需要访问代码中的加密密钥,所以所有密码都会被有效地泄露


您应该使用单向has函数,如or(SHA1更好)。当用户尝试登录时,加密他们使用的密码,并将其与您存储的密码进行比较。

要加密:

base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0");
要解密:

base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_256, md5($key), $string, MCRYPT_MODE_CBC, md5(md5($key))));
rtrim(mcrypt_decrypt(MCRYPT_RIJNDAEL_256, md5($key), base64_decode($string), MCRYPT_MODE_CBC, md5(md5($key))), "\0");

不过,最好是将你的密码(用salt!)散列,并给你的用户一个重置链接,这样你甚至可以避免自己/你最终的错误。

我会按照每个人最喜欢的开发社区网站来建模

但是,非常严肃地说,在后端托管密码,以便可以检索并向最终用户显示密码,这会带来一些安全问题:

  • 具有数据库/密钥访问权限的用户可以访问所有密码
  • 当发送给最终用户显示时,可以嗅探密码
我建议使用单向散列(谷歌搜索最佳算法——SHA-1在几年前很好,但人们总是在破解加密算法方面取得进展)。您只需将散列应用于最终用户提供的密码,并将其与存储的散列密码进行比较——如果结果字符串匹配,则验证成功


如果你想改用经过验证的公钥或对称密钥算法,至少要努力避免在网络上以明文形式发送密码。

我认为这不是一个好主意。我讨厌网站通过电子邮件发送我自己的密码。密码不应该写在任何地方。我认为在实践中,最好用一个单向散列加盐。如果开门取回密码,您将承担向未经授权人员透露密码的责任。共享同一密码的其他系统上的用户帐户也可能被泄露。您能否详细说明为什么需要向他们发送密码而不是重置为新密码?这似乎是一个不必要的冒险,没有什么好处。我刚刚看到一篇文章,一个好的认证系统应该使用这样的系统。但是在这里看到所有的答案后,我想我确信我应该走一条路。我刚刚将phpass集成到我的项目中!:)