7

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

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

我只能想到以下内容:

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

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

谢谢

另外:值得注意的是,发送数据将是一个 SSL 连接。

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

4

7 回答 7

7

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

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

于 2012-11-21T16:24:20.973 回答
3

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

于 2012-11-21T16:28:56.867 回答
1

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');
} 
?>

它会让生活变得容易得多。只需将您的公钥复制到任何地方,并将您的私钥保存在您身上。

于 2012-11-21T16:32:27.450 回答
1

好吧,您可以使用用户自己的密码加密密码(而不是将其存储在任何地方),并且每次进行通信时都询问它,这样密码可能是安全的。

于 2012-11-21T16:26:42.387 回答
1

相反,您应该做的是使用 Oauth - 如果正确实施,它会更安全且对用户更友好。

Zend oauht 客户端

于 2012-11-21T16:36:11.660 回答
0

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

于 2012-11-21T19:42:50.143 回答
0

您可以使用 php mcrypt,请在​​此处查看相关问题。或者,如果您更喜欢加密/解密服务器端 mySQL 具有 AES 加密功能。

于 2012-11-21T16:27:55.143 回答