1

我们的客户通过SSL调用我们的Web服务并使用用户名和密码进行身份验证。我们的服务器然后生成一个对称密钥并将其发送回客户端。如何基于拥有对称密钥来验证客户端?

然后,客户端建立到我们的服务器的TCP连接,并发送登录消息。此时,我想验证客户端。

我的想法是让客户端用一个对称密钥加密一段知名/静态的文本,并用它作为拥有密钥的证据。

由于对称密钥是随机生成的,我可以在这里使用静态文本吗?

任何输入赞赏。

回答

2

SSL旨在验证客户端和服务器,并且非对称密码术是您可以在此方案中使用的最安全的基元。对称密码可以通过使用另一种称为CBC-MAC模式的Cipher Block Chaining Message Authentication Code用于验证。 CBC-MAC的使用与HMAC具有相似的保护,但是使用对称密码而不是消息摘要功能。 WPA使用CBC-MAC模式来保护无线网络。

+0

感谢您的回复。我使用的是.NET 2.0,它看起来像CBC-MAC仅支持3.5版本(http://blogs.msdn.com/b/shawnfa/archive/2009/03/17/authenticated-symmetric-encryption-in -net.aspx)。我想使用CBC-MAC或使用哈希算法创建MAC并将其附加到消息中,但登录消息包含的信息很少(基本上只是用户名),我认为这可能会造成一个弱点。也许我错了。 – 2010-06-30 16:27:26

+0

@Lars A. Brekken我确定在ASP或C#中有另一种实现(或任何您使用的)。建立你自己的并不难,然后验证它与.net 3.5的实现。 – rook 2010-06-30 16:30:22

+0

@Lars A. Brekken如果你确实使用了散列mac,那么你仍然需要使用一个秘密。这可以通过SSL传输,类似于会话ID。 – rook 2010-06-30 16:43:43

2

您的想法受限于重播攻击 - 如果有人观察用户登录,他们可以存储静态文本加密的对称密钥并稍后使用它来验证自己。

这样做的接受方式是一种挑战/回应。客户端连接后,服务器生成一个随机挑战并将其发送给客户端,客户端用挑战的加密版本进行响应(尽管您应该在这里实际使用HMAC,而不是分组密码,因为否则您的客户端是有效的一个单块解密oracle!)。使用两个不同的随机密钥(通过Web服务同时提供)也是更安全的,一个用于加密,一个用于验证。

请注意,虽然这个方案,如书面,仍然容易受到中间人攻击。您使用SSL肯定会更好,因为The Rook暗示。这将要求您的客户端生成公钥并将其发送到Web服务。 Web服务使用包含客户端公钥的签名证书以及DN字段中的客户端唯一标识符(用户名或其他)进行响应。单独连接上的服务器验证使用的客户端证书(确保它由Web服务签名),并验证证书中的客户端标识符是否与要求连接的客户端匹配。

相关问题