情况 1 - 将服务器连接到数据库
这里没有一个简单的答案。为了连接,服务器需要密码(或对称密钥,或私钥或其他)。它必须从磁盘或某些外部方式(例如管理员在启动时键入它)获取它。添加一些间接性,例如在主密码下加密所有敏感内容,可以增加一些便利,但不会改变这种情况。
通常,可以将密码或密钥放在服务器上的文件中。如果这样做,请确保设置文件的权限,以便只有需要它的用户才能访问它。这是让系统上的不同进程以不同用户身份运行并为每个用户设置单独角色/帐户和密码的绝佳理由。
情况 2 - 用户从远程计算机登录服务器
我认为你正朝着正确的方向前进。听起来您要求的是安全的身份验证协议。您需要一个提供相互身份验证并通过在尝试此类攻击时失败来防止中间人攻击的工具。当然有很多选择。
同样值得考虑的是您的身份验证是否应该基于“您知道的东西”(密码)或“您拥有的东西”(公钥/私钥)进行操作。根据您的问题假设我们正在寻找的是密码,我喜欢的两个是 SRP 和 Kerberos。
SRP 前面提到过,但几乎没有得到应有的关注。SRP 的优点是它不需要服务器知道密码、密钥或任何攻击者可以用来获取访问权限的东西。如果您使用 SRP 闯入正确配置的服务器并窃取了所有数据,那么您仍然需要对每个键单独执行字典攻击之类的操作,然后才能使用任何可以用来模拟用户的东西。
我也喜欢 Kerberos,因为它受到大量软件的支持(我知道 Postgres 支持它,我只发现 mysql 不支持任何良好的身份验证技术)并且有一个提供单点登录功能的“票证”系统。Kerberos 需要一些其他技术来帮助加强其初始身份验证交换,而 SRP 对此非常有用,但我不确定他们是否已经这样做了。我认为它使 KDC(密钥服务器)有状态。
Kerberos 的弱点是您必须更加警惕存储密钥的服务器。虽然它不以明文形式存储密码,但它确实存储了密钥,这些密钥本质上是密码的散列版本。虽然客户端在身份验证时不会直接发送密码或密钥(毕竟这是一个真正的身份验证协议),但它确实使用散列密码作为密钥,因此任何知道算法并知道的人钥匙可以做同样的事情。我们说服务器存储“密码等价物”。因此,所有手册都告诉管理员将 kerberos 服务放在自己单独的、锁定的盒子上,以最大限度地减少损害其内容的机会。
好消息是,一旦你确定了一个强大的身份验证交换,其他好东西通常会免费掉出来。您最终会得到双方共享一个共同的“秘密”,该“秘密”可以在会话期间使用一次,永远不会通过网络发送,并且第三方无法知道。想要加密?有钥匙,一切准备就绪。这正是 RFC 5054 中定义 SRP 安全 SSL 的方式。