2010-10-06 126 views
4

我想使用HTTPS来保护我的客户端和服务器之间的通信。第一次加密通信将用于认证用户 - 即检查他/她的用户名和密码。使用HTTPS进行客户端 - 服务器通信

用户凭证将成功由服务器检查后,我想开始在后续请求中获取一些数据。但是服务器将如何确定后续请求是由用户发送的,而用户的凭证已被检查?

由于TCP连接可能在登录和后续HTTPS请求之间关闭,(我认为)这意味着SSL上下文必须由服务器释放,所以通过新的GET请求,必须建立新的TCP连接并新的SSL(TLS)握手必须完成(即加密的新共享密码必须由双方交换等)

为此,我认为服务器需要发送回客户端200 OK响应初始身份验证请求会随机生成一些随机生成的随机数(在某个时间内有效),我将在随后的每个请求中包含该数据,以便服务器能够基于此随机生成的随机数检测哪个用户名位于请求后面,检查该用户是否已经登录我的理解是否正确?

非常感谢您的答复 BR 斯登

回答

2

最简单的方法是,要求所有通信通过HTTPS去(这样的数据是保密的,不是客户端的其他人,服务器可以看到它)和对该安全连接中的每个请求使用简单的用户名和密码。这在实践中很简单(用户名和密码实际上是通过HTTP头进行连接的,因为我们使用的是HTTPS),并且服务器每次都可以检查允许用户被允许使用。您不必担心SSL握手;这就是SSL/HTTPS层的责任(这就是为什么HTTPS/SSL是不错)。

或者,登录可以用任何方法完成,并生成存储在会话cookie中的某种幻数(例如,UUID或随机数和用户名的密码散列)。随后的请求可以检查幻数是否可以从会话开始时识别出来(并且自从发布后没有太多时间);注销只是忘记了服务器端的神奇数字(并要求客户忘记)。实现这一点还有一些工作要做,但仍然不难,服务器端有库来处理驴工作。

第一个选项特别适合您写程序的地方,因为它很容易实现。如果客户端是网页浏览器,第二种选择更好,因为它允许用户更好地控制浏览器授权的时间(程序API不需要这样的事情)。无论客户何时成为浏览器,您都需要注意防范其他类型的攻击(例如,各种类型的请求伪造),但这几乎与其他任何事情无关。

+0

嗨,非常感谢您的评论!所有通信都会通过HTTPS进行 - 无一例外。我也是这样想的 - 在每个请求中发送用户名/密码或者让服务器用一些魔法回复第一个请求,然后我将在每个请求中使用它,而不是重复用户名/密码(我的客户端不是浏览器,但自定义应用程序)。我认为这两种方法都差不多,而第二种方法需要在服务器上完成更多的工作。我可以问你什么是行业标准? HTTPS应用程序是否以重新发送每个请求中的用户名/密码的方式创建?谢谢,BR STeN – STeN 2010-10-06 12:22:06

+0

@STeN:有几个“行业标准”,取决于您的要求是什么。我列出了以上两种非常常见的常见使用模式。还有其他的(例如,SSL级别的客户端证书),但它们不太常见,并且更容易遇到获取便携式实施或良好部署的问题。 – 2010-10-06 23:41:23

+0

谢谢 - 你的建议非常好! – STeN 2010-10-07 04:15:13

0

在你的案例中发明自定义认证机制是非常危险的 - 很容易犯一个错误,会让很多错误的做法。因此,正确的做法就像使用HTTPS并在每个请求中传递用户凭证一样。

+0

嗨,我将只使用HTTPS。但服务器仍然需要知道谁正在访问它。通信必须安全,但用户必须通过身份验证才能访问系统。正如Donal Fellows先生在下面的评论中所建议的 - 最简单的方法是在每个请求中包含用户名和密码......感谢您的评论。 – STeN 2010-10-06 12:31:17