2012-11-21 54 views
4

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

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

我只能够想到的东西像下面这样:

当用户添加自己的凭据,外部服务到他们的帐户,他们为我的应用程序重新输入自己的密码,并且(在加密的形式)用于以某种方式'加密'外部服务的密码,但以一种使其仍然可访问的方式。

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

感谢

此外:这是值得注意的是,这将是一个SSL连接数据被发送过来。

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

+0

你最初接受的凭证? –

+0

是的,用于外部服务的凭证最初将在用户将其添加到我的应用程序的帐户时输入。 – Seer

+0

用户使用外部密码登录到您的应用程序?或从您的应用程序密码? –

回答

5

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

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

+0

对此+1,md5和sha1不加密数据,他们散列它。 –

1

那么,你可以用用户自己的密码加密密码(不要存储在任何地方),每次进行通讯时都要问这个密码,这样密码可能是安全的。

+0

这是你的意思,他们会每次输入我的应用程序的密码或外部服务? – Seer

+0

适合您的应用。他们的密码是用于加密/解密外部服务密码的密钥。但是如果用户忘记密码,所有加密的密码将会丢失。 –

+0

好吧,说会有一个'忘记密码'功能。这意味着需要重新输入其外部帐户的所有密码,然后使用新密码作为密钥进行重新加密,这同样适用于用户是否要更改我想的密码。 – Seer

0

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

2

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

+0

我的应用程序的密码将被存储使用(最有可能的)blowfish加密。这当然可以很容易地检查,这是我猜的。你的答案的总体思路是我在想什么,不知怎的,用户的密码用于我的服务,用于'撤消'加密外部服务的密码。 – Seer

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

它将使生活变得更轻松。只需将您的公钥复制到任意位置,并将私钥保存在您的身上。

1

你应该做的就是使用Oauth - 当它正确实现时更安全,也更加用户友好。

Zend oauht client

0

您可以使用这样的PKIF(特别PKIFCRYPTO)和NSSMS-CAPI。这不是因为内心的虚弱,而是你想要向决定信任你的用户展示一定程度的能力。