【问题标题】:What is the best way to implement 2-way encryption with PHP?用 PHP 实现 2 路加密的最佳方法是什么?
【发布时间】:2009-03-15 09:08:08
【问题描述】:

我想在 PHP 中使用 2 路加密来加密我网站上的密码。我遇到过 mcrypt 库,但它看起来很麻烦。任何人都知道任何其他更简单但又安全的方法?我确实可以访问 Zend 框架,所以使用它的解决方案也可以。

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

【问题讨论】:

  • 客户端为什么要找回密码?这通常是个坏主意。为管理员提供重置密码的功能,如果用户知道原始密码,则可以更改密码。

标签: php security encryption passwords


【解决方案1】:

您应该存储经过哈希处理的密码(和 properly salted)。

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

目前,使用 crypt 和 CRYPT_BLOWFISH 是最佳做法。
PHP 中的 CRYPT_BLOWFISH 是 Bcrypt 哈希的实现。 Bcrypt 基于 Blowfish 分组密码。

  • 如果您的客户端尝试登录,您可以对输入的密码进行哈希处理,并将其与存储在数据库中的哈希值进行比较。如果匹配,则授予访问权限。

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

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

  • 如果您的客户想要查找当前密码,他们不走运。这正是散列密码的重点:系统不知道密码,因此永远无法“查找”/窃取密码。

Jeff 博客:You're Probably Storing Passwords Incorrectly

如果您想使用标准库,可以查看:Portable PHP password hashing framework 并确保使用 CRYPT_BLOWFISH 算法。

(一般来说,直接乱搞数据库里的记录是自找麻烦。
许多人——包括非常有经验的数据库管理员——都发现了这一点。)

【讨论】:

  • 我认为您想编辑您的第一条语句为:“您应该存储散列密码”
  • 您的意思是在这里写 Blowfish 吗? Blowfish == 对称密钥加密,而不是散列。我强烈建议散列而不是加密。
  • Blowfish 与 PHP 的 crypt(CRYPT_BLOWFISH 标志)是一个 Bcrypt 实现;设计为基于 Blowfish 的强大哈希算法。
  • 这是一个很好的“如何加密密码”的商业广告 - 但实际上并没有回答 OP 的问题。
  • 为什么这是公认的答案?它根本没有提供任何关于 2 路加密的信息。
【解决方案2】:

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

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

http://phpsec.org/articles/2005/password-hashing.html

【讨论】:

  • 谢谢。我刚刚在我的问题中添加了这一行 - 我实际上需要双向加密,因为我的客户想要进入数据库并更改密码或检索它。
  • 好吧,您不妨用“PleaseHackMe”键对密码进行异或运算。不过说真的,请让您的客户相信他们只需要重置密码——而不是找回密码。
  • 这是一个很好的答案,除了我不推荐 SHA-1 算法,它已被证明比应有的更容易破解。我推荐 SHA-256 或该系列之一(SHA-384、SHA-512 等)。
【解决方案3】:

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

实现这一目标的两个函数是openssl_public_encrypt()openssl_private_decrypt()

【讨论】:

  • 这听起来是实现这一目标的唯一方法,并且至少具有一定的安全性。
  • M_CRYPT 是专为数据加密和解密而设计的库,OpenSSL 库用于秘密/安全通信。
  • 这是一个足够公平的答案。我还要补充一点,您永远不应该将私钥存储在同一服务器或任何相关服务器上的任何位置。在整个硬盘中搜索密钥相对容易。
【解决方案4】:

要么以明文形式存储它,要么存储密码的哈希值(即不可逆)。

做任何其他事情——尤其是使用带有硬编码密钥的对称加密——基本上是没有意义的。

如果您按照您的建议进行操作,并且您的计算机遭到入侵,则攻击者不仅可以访问加密密码,还可以访问代码和解密它们的密钥,因此它们也可能被明文存储。

如果您想保护您的数据免受他人对机器的物理访问,请使用加密文件系统(但仍将密码明文存储在其中的数据库中)。当然每次重启,你都需要手动输入密钥才能使用系统。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-27
    • 2011-05-20
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 2022-01-25
    • 1970-01-01
    • 2014-09-16
    相关资源
    最近更新 更多