我正在创建一个基于异步套接字的客户端服务器通信,我的客户端将用户名和密码发送到服务器然后服务器将重播该帐户是否有效,所以我想确保此步骤的安全以便没有人可以记录对话并不断发送给我的客户以实现对 secret 数据的非法访问
[问题{简化}] 如何向服务器安全地验证客户端......?
[注意] 我知道 SSL,但我无力支付证书费用,因此我需要一个免费的替代方案来提供我的客户端和服务器之间的安全通信。
最佳答案
一如既往,最安全的密码是服务器不知道且永远不会传输的密码。所以你可以做的是:
- 在服务器上,存储用户名、随机加盐(“帐户加盐”)和加盐密码的安全哈希值(“服务器共享 secret ”)。
- 登录时,第一步让客户端只传输用户名(不是密码)
- 服务器应回复帐户盐(非 secret )和随机生成的 session 盐(非 secret )。 服务器生成 session 盐很重要。
- 在客户端上,用帐户盐对密码进行加盐并对其进行哈希处理(将其保存为“客户端共享 secret ”),然后用 session 盐对结果进行加盐并再次对其进行哈希处理。将其作为身份验证 token (非 secret )传输
在服务器上,从您的数据库中获取加盐散列,用 session 加盐加盐并对其进行散列 - 如果这与身份验证 token 匹配,则连接已通过身份验证。 (客户端向服务器进行身份验证)
如果您想向客户端额外验证服务器,您可以重复该过程:客户端生成盐,服务器通过加盐/散列存储的 secret 从中创建 token 。
如果您想验证单个请求(不仅是连接),请使用共享 key 对它们进行加盐并对其进行哈希处理,将其作为每个请求的验证字段发送。由于在有效的登录服务器共享 key 和客户端共享 key 相同,双方应该得到相同的结果,从而验证身份验证字段。
关于c# - 客户端服务器身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12254710/