【问题标题】:PHP how to secure password in databasePHP如何保护数据库中的密码
【发布时间】:2013-11-05 21:47:28
【问题描述】:

我正在使用来自另一台服务器(不是我的服务器)的数据,我需要登录到这台服务器。所以我需要知道每个用户帐户的密码。我需要通过 HTTP 请求将此密码发送到服务器(没问题)。但是服务器期望不安全的密码。

所以如果密码是“123456”,我必须发送带有数据的 POST 请求:

"username=user&password=123456"

我不能使用 md5 功能,因为在它之后我无法取回密码所以我的问题是如何编码这个密码?是否存在一些常见的 PHP 函数?例如:

$securePassword = php_encode("123456", "mykey")
php_decode($securePassword, "mykey")

因为我只是不想将“123456”存储到我的数据库中

【问题讨论】:

  • 这真的很不安全...也邮寄...
  • 您需要在用户离线的情况下进行操作吗?如果你不这样做,那么你可以简单地将密码存储在会话中。
  • 是的,这个密码只会被存储到数据库中一次,之后会有一些脚本每天自动运行(没有用户)。

标签: php passwords


【解决方案1】:

使用mcrypt_encrypt()mcrypt_decrypt()
了解更多信息SO POST

【讨论】:

  • 这大概是我需要的。最好的想法是我能做的就是保护密码(在我的数据库中),因为没有其他方法可以将密码发送到该服务器,然后是 POST 方法。
  • @Lodhart 很高兴听到它有帮助。好吧,但我相信没有算法是牢不可破的。
【解决方案2】:

散列的要点是您无法取消加密它。要检查某人是否输入了正确的密码,请对他们输入的内容进行哈希处理,并将其与数据库中密码的哈希值进行比较。如果匹配,则密码正确;否则,这是错误的。此外,只要您使用 SSL 和体面的哈希算法,您就应该是安全的。

【讨论】:

    【解决方案3】:

    如果你的 PHP >5.5,你可以使用函数password_hash。如果你有一个比 PHP 5.3.7 大的低版本,你应该使用password compat

    【讨论】:

      【解决方案4】:

      您要寻找的不是如何保护密码,而是如何保护密码传输。您可以使用传输层安全性(又名 TLS 又名 SSL)来执行此操作。

      也就是说,不建议以这种方式传输密码,应该设计一个更好的机制。如果您加密或散列密码并传输密文,这根本没有 提供任何保护,因为攻击者只会像您一样发送密文。

      您需要对传输中的数据进行加密。在您的网站上设置 SSL。

      【讨论】:

      • 我知道,我知道,通过 POST 请求发送密码的想法很糟糕。但是另一台服务器不是我的,如果我想使用 SSL,另一台服务器必须支持 SSL,对吗?问题是我对其他服务器的信息非常有限。
      • 是的,其他服务器需要 SSL。如果它可以通过 SSL 处理通信,那么您可以以纯文本形式发送密码而不必太担心,但您不应该这样做。它应该总是被散列(和加盐)。如果这确实是您的情况,那么您似乎别无选择。请理解,即使密码已加密/散列,攻击者也会像您一样发送散列密码。他们仍然可以在不知道密码是什么的情况下轻松冒充您。
      • 我真的明白了,不管你发送什么,如果只是 POST 请求,你可以简单地捕获 HTTP 通信并使用它。问题是我不能影响它。 POST 请求。只是我如何从该服务器获取数据的一种方法。所以我只想在我的数据库中编码密码,因为我不仅仅是一个可以访问数据库的人。
      • 如果其他人可以访问您的数据库,那么您需要在输入数据时加密数据,然后在输出数据时对其进行解密。您还需要将密钥存储在其他人无法访问的地方,或者使用受保护的 API 从数据库中获取/放置数据。
      【解决方案5】:
      【解决方案6】:

      密码被散列而不是加密是有原因的。您无法解密哈希。一般来说,惯例是做以下事情:

      创建密码

      1. 将新密码发送到服务器
      2. 散列密码
      3. 将哈希存储在数据库中

      检查密码

      1. 将密码发送到服务器
      2. 散列密码
      3. 检查哈希是否与存储在数据库中的哈希匹配

      为此,您应该使用 SHA256 之类的东西:

      // check password
      $hash = hash('sha256', $password);
      $db_hash = db_get_password($username, ...);
      if ($hash == $db_hash) { 
          // correct password
      }
      

      【讨论】:

      • 我知道这个原理,我正在我的服务器上使用它。但我需要从另一台服务器获取内容并获取我需要登录的内容(一切都通过 PHP)。我触发了浏览器和服务器之间的数据以了解如何登录,我需要发送 POST 请求。带有登录名和密码。这就是我对第二台服务器的了解。
      猜你喜欢
      • 2010-09-11
      • 2014-07-22
      • 1970-01-01
      • 2019-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多