PHP - 安全地存储外部服务的密码?

Posted

技术标签:

【中文标题】PHP - 安全地存储外部服务的密码?【英文标题】:PHP - Storing password for external service securely? 【发布时间】:2012-11-09 22:56:36 【问题描述】:

我目前正在计划开发一个 php 应用程序,该应用程序需要存储外部服务的用户密码,以便在用户登录我的应用程序时可以同时登录。

我需要以安全的方式存储密码,即不是纯文本,也不是 base64 编码,但也需要应用程序以纯文本形式访问。

我只能想到以下内容:

当用户将外部服务的凭据添加到他们的帐户时,他们会重新输入我的应用程序的密码,并且该密码(以加密形式)用于以某种方式“加密”外部服务的密码,但在一种让它仍然可以访问的方式。

是否有人对这是否可行或潜在的解决方案有任何想法?

谢谢

另外:值得注意的是,数据是通过 SSL 连接发送的。

出于好奇:比如说; Google Mail,您可以将电子邮件帐户添加到您的 Google Mail 帐户,以便检查所有这些帐户。有人对 Google 如何存储您添加的帐户的密码有任何想法吗?

【问题讨论】:

您最初接受凭据吗? 是的,用于外部服务的凭据最初将由用户在将其添加到我的应用程序的帐户时输入。 用户使用外部密码登录您的应用程序?还是使用您应用中的密码? 使用我的应用程序中的密码。 【参考方案1】:

一般来说,这个问题是,如果你的系统都受到攻击,攻击者可以获得所有系统的所有密码,因为它们是加密的而不是散列的。没有办法解决这个问题,因为您希望能够获得纯文本密码。

如果你必须这样做,你可以使用像 OpenSSL 这样受信任的东西来加密密码。

【讨论】:

【参考方案2】:

从证券的角度来看,您真的不应该在任何地方存储密码。我会让用户输入他们的密码 md5 他们的密码并存储它。因此,当他验证其已验证的与 md5 时。至于外在。您可以获取外部密码并将外部密码与存储的 md5 进行异或。这样您就可以撤消它以将其传递给外部源。或者更好的方法是每次都询问外部密码。这是风险与便利的选择。

【讨论】:

我的应用程序的密码将使用(很可能)河豚加密进行存储。这当然可以很容易地检查,这就是我猜的重点。您回答的总体思路是我的想法,不知何故,我的服务的用户密码被用来“撤消”外部服务密码的加密。【参考方案3】:

嗯,你可以用用户自己的密码来加密密码(不要存储在任何地方),每次通信时都要询问,这样密码可能是安全的。

【讨论】:

你的意思是,他们每次都会输入我的应用程序或外部服务的密码? 为您的应用程序。他们的应用程序密码是用于加密/解密外部服务密码的密钥。但是如果用户忘记了密码,所有的加密密码都会丢失。 好吧,假设会有“忘记密码”功能。这意味着他们的外部帐户的所有密码都需要重新输入,然后用新密码作为密钥重新加密,如果用户要更改密码,我想这同样适用。 如果用户更改密码,您可以对旧密码进行批量解密,对新密码进行批量加密。 非常正确,这更有意义。【参考方案4】:

GAH...我希望每个人都将键标准化:

<?php
$connection = ssh2_connect('shell.example.com', 22, array('hostkey'=>'ssh-rsa'));

$sth = $dbh->prepare('select keyLoc from auth where username = :user');
$sth->bind_param('user', 'username');
$key = $sth->fetch(PDO::FETCH_ASSOC);

if (ssh2_auth_pubkey_file($connection, 'username',
                      $key,
                      '/home/username/.ssh/id_rsa', 'secret')) 
  echo "Public Key Authentication Successful\n";
 else 
  die('Public Key Authentication Failed');
 
?>

这会让生活变得更轻松。只需将您的公钥复制到任何地方,并将您的私钥随身携带。

【讨论】:

【参考方案5】:

您应该改为使用 Oauth - 如果正确实施,它会更安全且对用户更友好。

Zend oauht client

【讨论】:

【参考方案6】:

你可以使用php mcrypt,见相关问题here。或者,如果您更喜欢加密/解密服务器端 mysql 具有 AES 加密功能。

【讨论】:

【参考方案7】:

您可以使用PKIF(特别是PKIFCRYPTO)和NSS 或MS-CAPI 之类的东西。这不适合胆小的人,但您需要向决定以他们的凭据信任您的用户展示一定程度的能力。

【讨论】:

以上是关于PHP - 安全地存储外部服务的密码?的主要内容,如果未能解决你的问题,请参考以下文章

存储和更新外部 API 密码的最佳实践

服务器云存储相比电脑存储外部驱动器更安全易用

Git http - 安全地记住凭据

PHP安全:XML注入漏洞防护

如何安全地存储用户的密码?

PHP接收外部发来的数据