我想在PHP中使用双向加密来加密我网站上的密码。我遇到了mcrypt库,但它看起来很麻烦。任何人都知道任何其他方法更容易,但又安全吗?我可以访问Zend Framework,因此使用它的解决方案也可以。
我实际上需要双向加密,因为我的客户端想要进入数据库并更改密码或检索密码。
答案 0 :(得分:25)
您应该存储密码哈希(以及 properly salted )。
世界上没有任何借口足以破坏这条规则。
目前,使用crypt和CRYPT_BLOWFISH是最佳做法 PHP中的CRYPT_BLOWFISH是Bcrypt哈希的实现。 Bcrypt基于Blowfish分组密码。
如果您的客户端尝试登录,则对输入的密码进行哈希处理,并将其与存储在数据库中的哈希值进行比较。如果匹配,则授予访问权限。
如果您的客户想要更改密码,他们需要通过一些小脚本来执行此操作,该脚本可以正确地散列新密码并将其存储到数据库中。
如果您的客户想要恢复密码,则应生成新的随机密码并发送给您的客户。新密码的哈希值存储在DB
如果您的客户想要查找当前密码,他们运气不好。这正是哈希密码的重点:系统不知道密码,所以它永远不会被“抬头”/被盗。
Jeff发表了关于它的博文:You're Probably Storing Passwords Incorrectly
如果您想使用标准库,可以查看:Portable PHP password hashing framework并确保使用CRYPT_BLOWFISH算法。
(一般来说,直接搞乱你数据库中的记录就是在惹麻烦 许多人 - 包括非常有经验的数据库管理员 - 已经找到了困难的方法。)
答案 1 :(得分:7)
不加密密码。你永远不需要解密它们,你只需要验证它们。使用mcrypt并不比什么都不做要好,因为如果黑客闯入你的网站偷了加密密码,他们可能也会窃取用来加密它们的密钥。
为您的php应用程序创建一个“密码”函数,在该应用程序中,您获取用户的密码,将其与salt连接并通过sha-256哈希函数运行生成的字符串并返回结果。每当您需要验证密码时,您只需要验证密码的哈希值是否与数据库中的哈希值匹配。
答案 2 :(得分:4)
如果您确实需要稍后检索密码,则至少应使用私钥和公钥,以便攻击者需要私钥(不应存储在同一台计算机上)来解密密码。
实现此目标的两个功能是openssl_public_encrypt()
和openssl_private_decrypt()
答案 3 :(得分:1)
将其存储在明文中,或者存储密码的哈希值(即不可逆)。
做其他事情 - 特别是使用带有硬编码密钥的对称加密 - 基本上没有意义。
如果按照您的建议并且您的计算机遭到入侵,攻击者不仅可以访问加密的密码,还可以访问解密它们的代码和密钥,因此它们也可以以明文形式存储。 / p>
如果要保护您的数据免受获得对计算机的物理访问权限的人的影响,请使用加密文件系统(但仍将密码以明文形式存储在数据库中)。当然,每次重启时,您都需要在系统可用之前手动输入密钥。