加密或哈希密码

4
我有一个不太常见的情况,或对某些人来说很常见。我需要在数据库中存储一些密码。让我解释一下我真正需要的是什么。
我有一些服务器,我需要每天三次访问它们,全年无休地运行着SSH服务,并且我的软件每天都要请求访问每个服务器三次。好的,一切都按照我希望的方式正常工作,问题是,密码!如何管理所有密码!
今天我将所有服务器密码保存在脚本中(实际上运行SSH服务的相同脚本),因为我使用SSH2 PHP函数ssh2_auth_password()来验证服务器,但这是明文。
那么,对于这个函数ssh2_auth_pubkey_file(),我该如何使用它?
在自己的脚本中存储密码安全吗?我认为不是..
那么在这种情况下该怎么办呢?如果我将密码存储在数据库中,我将需要在每个服务器请求时检索密码(它由cron运行),然后如果它是哈希值,我可以将其与我的脚本中的另一个哈希值进行比较并返回明文以进行身份验证,但仍然是明文..(但我认为这还不是一个好的解决方案!)。
加密密码,然后在每个服务器请求时解密密码?也许是可能的..
有人有任何想法在这种情况下该怎么做吗?
我很困惑!
提前感谢您的帮助!
[编辑]
我的架构是Kernel Linux 2.6,大多数都是,SaaS应用程序运行在外部(中立服务器)上,CronJobs定期运行3次/天,一切都是通过命令行自动完成的,没有人为干预。
[再次编辑]
我应该在哪里生成密钥对?只需要一个密钥对就足够了吗?包括SaaS APP服务器在内的所有服务器?还是我需要逐个生成密钥对?有点困惑..
                CRON JOBS (fire servers) 3x/day
              ------------
              | SaaS APP |________________________
      ________------------_______                |
     |             |             |               |
     |             |             |               |
-----------   -----------   -----------          |
| SERVER1 |   | SERVER2 |   | SERVER3 |  ....  SERVER4 ....
-----------   -----------   -----------

再次感谢!


7
"我在游泳池里!" 我读到这句话时,立刻想象起了Old Spice Guy问这个问题的场景。 - Alex Howansky
4
不要使用密码,使用公钥/私钥身份验证。 - ceejayoz
1
如果您的脚本不可从外部访问(而且它不应该被放在wwwroot下),那么您的密码是“安全”的;当然,您必须确保没有人可以在您的Web服务器上获得更高的权限(但这仍然需要做到)。 - Viruzzo
1
@tandu,请不要编辑问题,除非您正在进行有益的更改。 - Justin ᚅᚔᚈᚄᚒᚔ
1
Fernando,你能否详细介绍一下系统的架构?据我所知:您有通过ssh访问的服务器和运行PHP代码的客户端。客户端PHP代码是通过cron、手动命令行还是通过浏览器运行的? - Justin ᚅᚔᚈᚄᚒᚔ
显示剩余4条评论
3个回答

4
如果您正在通过ssh进行服务器内部通信,则一定要使用公钥。如果您只是使用基于密码的身份验证,那么如果目标服务器被攻击或SSL隧道被破解,密码可能会被窃取。问题在于,您必须每次都提供密码(好吧,您可以使用无密码公钥,但最好不要)。为了克服这个困难,您可以使用公钥和一个存储您身份验证密码的ssh代理,这样您只需要在每次重新启动时输入这些密码一次即可。

Debian上的Pubkey auth教程


嗯?如果你只能使用公钥,为什么不用呢?比混合方法更安全。 - Kzqai

1
你可以使用mcrypt_encrypt PHP函数将密码加密存储在数据库/文件中,并在每次连接之前自动解密该密码。当然,你需要另一个密码来加密你的SSH密码,这个密码可以存储在另一个文件中,或者像之前提到的那样,在每次重新启动后提示输入此密码并仅将其存储在内存中。
例如:
<?php
$output = mcrypt_encrypt(MCRYPT_TWOFISH, $key, $plaintextPassword, MCRYPT_MODE_ECB);
//encode to base64 for easier manipulation
$stored = base64_encode($output);
...
$b64encoded = base64_decode($encryptedPassword);
mcrypt_decrypt(MCRYPT_TWOFISH, $key, $b64encoded, MCRYPT_MODE_ECB)
?>

我现在正处于一个十字路口,一方面是我的服务器密码需要经常更改的可能性,另一方面,如果密码真的经常更改,我认为最好的方法是加密密码并将其存储在数据库中,就像你在回答中所建议的那样。谢谢! - devasia2112

1

你使用ssh2_auth_pubkey_file()是正确的。

  1. 通过 ssh-keygen 生成公钥/私钥对。
  2. 将公钥添加到每个服务器的 ~/.ssh/authorized_keys 中。
  3. 将公钥和私钥复制到客户端机器,并使它们只能被需要使用它们的帐户读取。
  4. 在客户端中更改您的身份验证代码,例如:

    $ssh_conn = ssh2_connect('my.server.addr', 22, array('hostkey'=>'ssh-rsa'));
    if (ssh2_auth_pubkey_file(
       $ssh_conn,
       'sshuser',
       '/path/to/id_rsa.pub',
       '/path/to/id_rsa',
       'key_passphrase'
    )) {
       echo "Success";
    } else {
       echo "Failure";
    }
    

我认为这是正确的方法,但如果管理员频繁更改服务器密码会发生什么?我需要再次生成密钥对吗?谢谢。 - devasia2112
一旦你的方法能够正常工作,服务器上的密码就无关紧要了。客户端使用私钥向服务器证明其身份。这取代了认证过程中的密码。你的管理员可以每5秒更改服务器密码,但仍会正常工作。 - Justin ᚅᚔᚈᚄᚒᚔ
哇,太棒了!这就是我想听到的答案。这绝对是正确的方法。我现在就去尝试一下。再次感谢。 - devasia2112

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接