客户端服务器验证

时间:2012-09-03 22:34:49

标签: c# sockets authentication client communication

我正在创建基于异步套接字的客户端服务器通信,我的客户端会将用户名和密码发送到服务器,然后服务器将重播该帐户是否有效,所以我想保证这个步骤,所以没有人可以记录对话并继续将其发送给我的客户以实现非法进入秘密数据

[问题{简化}]如何安全地向客户端验证客户端...?

[注意]我知道SSL,但我无力支付证书,所以我需要一个免费的替代方案来提供我的客户端和服务器之间的安全通信。

4 个答案:

答案 0 :(得分:11)

与往常一样,最安全的密码是服务器不知道的密码,并且永远不会传输。所以你能做的是:

  • 在服务器上,存储用户名,随机盐(“帐户盐”)和盐渍密码的安全散列(“服务器共享密钥”)。
  • 登录时,在第一步中,让客户端仅传输用户名(非秘密)
  • 服务器应该使用帐户salt(非秘密)和随机生成的会话盐(非秘密)进行回复。重要的是,服务器会生成会话盐。
  • 在客户端上,使用帐户salt对密码进行加密并对其进行哈希处理(将其保留为“客户端共享密钥”),然后将结果与会话盐一起加盐并再次哈希。将其作为身份验证令牌(非秘密)传输
  • 在服务器上,从数据库中获取salted哈希,将其与会话盐一起加盐并哈希 - 如果这与身份验证令牌匹配,则连接已通过身份验证。 (客户端已通过服务器验证)

  • 如果您想要另外向客户端验证服务器,请重复以下过程:客户端生成一个salt,服务器通过对存储的密码进行盐析/散列来创建令牌。

  • 如果要对单个请求(不仅是连接)进行身份验证,请使用共享密钥对其进行加密并对其进行哈希处理,并将其作为每个请求的身份验证字段发送。由于在有效的登录服务器中共享密钥和客户端共享密钥是相同的,因此双方应该得到相同的结果,从而验证身份验证字段。

enter image description here

答案 1 :(得分:4)

我通常会告诉别人,如果他们发现自己正在自己加密,他们就会发明安全问题。 :)可能性很好,你缺少边缘情况。我建议依靠已经存在的东西并且已经得到很大的保护。

如果您正在使用托管套接字,则会有一个版本的流类为您执行加密(NegotiateStream)。我建议从那里开始,看看它是否可以做你需要的,而你必须发明自己的。

答案 2 :(得分:0)

您可以使用公钥和对称密钥的组合来保护身份验证。

首先发送一个公钥,让客户端发送加密的身份验证数据。如果数据有效,您可以让客户端生成自己的公钥,并通过彼此的公共方式发送对称密钥。键。

这样的事情应该有用。

答案 3 :(得分:0)

我知道这是几年前发布的,但我想我现在会在这里加两分钱。事情在过去几年发生了变化。这可能会帮助其他人。

我不想从欧根那里拿走任何东西,出色的工作。

加密客户端和服务器之间的流量的最佳方法仍然是使用SSL / TLS。您现在可以从https://letsencrypt.org/获得免费许可。

听起来你已经找到了SSL,所以我会插入你从上面的链接获得的免费证书

祝你好运, - 安德鲁