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

时间:2012-11-21 16:20:52

标签: php mysql database security passwords

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

我需要将密码存储在一个安全的,即非纯文本中,而不是base64编码,但也应该以某种方式由应用程序以纯文本形式访问。

我只能想到以下内容:

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

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

由于

:值得注意的是,它将是一个SSL连接,数据将通过它发送。

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

7 个答案:

答案 0 :(得分:5)

一般来说,问题在于,如果您的系统遭到全部攻击,则攻击者可以获取所有系统的所有密码,因为它们是加密的而不是哈希的。没有办法解决这个问题,因为您希望能够获得纯文本密码。

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

好吧,您可以通过用户自己的密码加密密码(不将密码存储在任何地方),每次进行通信时都要求密码,这样密码可能是安全的。

答案 3 :(得分: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');
} 
?>

这将使生活变得如此简单。只需在任何地方复制您的公钥,并将您的私钥保存在您身上。

答案 4 :(得分:1)

你应该做的是使用Oauth - 更安全,并且在正确实施时更加用户友好。

Zend oauht client

答案 5 :(得分:0)

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

答案 6 :(得分:0)

您可以使用类似PKIF(特别是PKIFCRYPTO)和NSSMS-CAPI的内容。这不适合胆小的人,但你会想要向决定信任你的用户展示一定程度的能力。