在域之间安全地发送用户名和密码

Sending username and password between domains securely

我们有一个网站 www.domain1.com,注册用户的 username/password 对存储在 domain1_db.

我们将有另一个单独的域 (www.domain2.com),如果用户尝试登录到域 2,username/password 将被发送到域 1,并对照 domain1_db 进行检查,并且如果用户存在且密码为真,将使用 username/password 和布尔值(真或假)

将响应发送到域 2

为了 un+pw 对在域 1 和域 2 之间发送时的安全。我评估了 3 个选项:

我想评估这些选项:

首先,如果您正在尝试构建一个系统,其中多个 Web 应用程序可以使用单个身份验证系统,那么您几乎可以肯定使用像 OAuth 这样的既定协议会更好。几乎每种语言都有实现。

其次,评估安全解决方案的唯一方法是了解上下文。有些解决方案总是很糟糕(例如,自行开发的加密算法),但没有任何解决方案总是足够的 - 拥有无限资源的攻击者可以破坏大多数解决方案。

您的第一个问题得到解答here:如果两个网站都属于您,并且永远属于您,您可以使用对称加密。

第二题回答here: an attacker who can persuade domain2 to accept a different computer as domain1 can trick domain2 into sending all the data to this server; this is a classic "man-in-the-middle" attack

在站点之间发送 username/password 时使用 HTTPS 足以确保凭证传输的安全。

这里真正的问题是为什么首先需要将密码发送回 domain2?如果 domain2 信任 domain1 来验证用户名和密码,那么它所需要的只是结果(有效用户与否)以及一些额外的信息,例如用户名和电子邮件地址等。它应该不需要用户密码。

此外,domain1 不应以可以检索密码的方式存储密码。密码需要以 salted hashed 形式存储。

更好的方法是使用为两个站点提供单点登录 (SSO) 的外部身份提供程序,因此您根本不必为存储密码而烦恼。

弱点在于密钥和密钥交换。我假设您会为每个选择使用强键。

如果您控制两台机器并且可以使用带外密钥交换(通过 sneaker-net 的拇指驱动器等),那么对称加密(例如 AES)将更快且更安全。

非对称加密(例如 RSA)在 Diffie-Hellman 密钥交换期间很弱,这就是为什么 SSL 不再安全并且每个人都转向 TLS 的原因。然而,非对称加密解决了 "I don't control both machines" 问题,因此我们可以容忍它的安全性稍差。

自签名证书是最糟糕的选择,因为如果您不控制两台机器,它只会失败或发出警告。如果您控制两台机器,只需使用 AES。

P.S。对于 SSL 和 TLS,RSA 仅被短暂使用。足够长的时间来交换对称密钥。之后就是对称加密了。