用PHP实现双向加密的最佳方法是什么?

用PHP实现双向加密的最佳方法是什么?,php,security,encryption,passwords,Php,Security,Encryption,Passwords,我想在PHP中使用双向加密来加密我网站上的密码。我偶然发现了mcrypt图书馆,但它似乎太笨重了。有人知道其他更简单但安全的方法吗?我确实可以访问Zend框架,因此使用它的解决方案也可以 实际上,我需要双向加密,因为我的客户端希望进入数据库并更改或检索密码。不要加密密码。你根本不需要解密它们,你只需要验证它们。使用mcrypt并不比什么都不做要好多少,因为如果黑客闯入你的网站并窃取加密密码,他们可能还能够窃取用于加密密码的密钥 为php应用程序创建一个“password”函数,在该函数中获取用户

我想在PHP中使用双向加密来加密我网站上的密码。我偶然发现了mcrypt图书馆,但它似乎太笨重了。有人知道其他更简单但安全的方法吗?我确实可以访问Zend框架,因此使用它的解决方案也可以


实际上,我需要双向加密,因为我的客户端希望进入数据库并更改或检索密码。

不要加密密码。你根本不需要解密它们,你只需要验证它们。使用mcrypt并不比什么都不做要好多少,因为如果黑客闯入你的网站并窃取加密密码,他们可能还能够窃取用于加密密码的密钥

为php应用程序创建一个“password”函数,在该函数中获取用户的密码,将其与salt连接,并通过sha-256哈希函数运行结果字符串并返回结果。每当需要验证密码时,只需验证密码的哈希值是否与数据库中的哈希值匹配


当您以后确实需要检索密码时,您至少应该使用私钥和公钥,以便攻击者需要私钥(不应存储在同一台机器上)来解密密码


实现这一目标的两个函数是和。您应该存储散列的密码(和)

世界上没有任何借口可以打破这条规则。

目前,与CRYPT_河豚一起使用是最佳实践。
PHP中的CRYPT_河豚是Bcrypt哈希的一个实现。Bcrypt基于Blowfish分组密码

  • 如果您的客户机尝试登录,则对输入的密码进行散列,并将其与数据库中存储的散列进行比较。如果它们匹配,则授予访问权限

  • 如果您的客户机想要更改密码,他们需要通过一些小脚本来完成,该脚本会正确地散列新密码并将其存储到数据库中

  • 如果您的客户希望恢复密码,则应生成新的随机密码并发送给您的客户。新密码的哈希值存储在数据库中

  • 如果您的客户想要查找当前密码,那么他们就倒霉了。这正是散列密码的要点:系统不知道密码,因此它永远不会被“查找”或窃取

关于它的博客:

如果您想使用标准库,您可以查看:并确保使用CRYPT_BLOWFISH算法

(一般来说,直接乱动数据库中的记录是自找麻烦。

许多人(包括非常有经验的数据库管理员)都发现了这一点。)

要么将其存储在明文中,要么存储密码的散列(即不可逆)

做任何其他事情——特别是使用硬编码密钥的对称加密——基本上是毫无意义的

如果您按照您的建议操作,并且您的计算机遭到破坏,则攻击者不仅可以访问加密的密码,还可以访问用于解密密码的代码和密钥,因此它们也可能已存储在明文中


如果您想保护您的数据,防止有人对计算机进行物理访问,请使用加密的文件系统(但仍将密码存储在数据库中的clear中)。当然,每次重新启动时,您都需要在系统可用之前手动输入密钥。

Thx。我刚刚在我的问题中添加了这一行-我实际上需要双向加密,因为我的客户机想要进入数据库并更改密码或检索密码。好吧,您也可以使用密钥“plessehackme”对密码进行异或。不过,认真地说,让你的客户相信他们只需要重置密码,而不是检索密码。这是一个很好的答案,只是我不推荐SHA-1算法,事实证明它比应该的更容易破解。我建议使用SHA-256,或是该系列中的一款(SHA-384、SHA-512等)。为什么客户端要检索密码?这通常是个坏主意。让管理员重新设置密码,如果用户知道原始密码,则允许用户更改密码。我认为您想编辑您的第一句话:“您应该将密码散列存储”您的意思是在这里写Blowfish吗?Blowfish==对称密钥加密,而不是散列。我强烈建议使用散列而不是加密;设计成一个基于河豚的强哈希算法。这是一个很好的“如何加密密码”的信息广告-但实际上并没有回答OP的问题。为什么这是公认的答案?它根本不提供任何关于双向加密的信息。这听起来像是实现这一目标的唯一方法,并且至少有一些安全性。M_CRYPT是专为数据加密和解密而设计的库,OpenSSL库用于秘密/安全通信。这是一个足够公平的答案。我还想补充一点,您不应该将私钥存储在同一台服务器或任何相关服务器上的任何位置。在整个硬盘上搜索一个密钥相对容易。