gpt4 book ai didi

c++ - 使用套接字在 C++ 中进行客户端到服务器身份验证

转载 作者:IT老高 更新时间:2023-10-28 21:51:05 26 4
gpt4 key购买 nike

我正在为我的小型服务器客户端程序实现登录/身份验证系统。我想知道如何解决这个问题,我希望一如既往地从 Stack Overflow 获得一些很棒的提示/建议。这就是我想我会这样做的方式。

  • 客户端连接到服务器。
  • 服务器向客户端发送一个“ token ”(可能基于时间等等)
  • 客户端返回用户名和 sha1 加密密码以及 token 。
  • 服务器接收它们并根据服务器端数据库中的凭据对用户进行身份验证。
  • token 现已验证,用户已使用 token 登录。

这是一种安全的方法吗?我想客户端还发送一个串行 key 或类似的东西来形成一个串行/ token 对,这样另一个客户端就不能伪造相同的 token (尽管 token 是由服务器端生成的)。

不需要实现细节,因为我有能力进行实现。

我的问题应该是两个问题:

  • 有哪些方法可以使用套接字实现登录/身份验证系统
  • 有哪些方法可以保护我的客户端到服务器的连接
  • 编辑:我忘了问,因为这是一个 C++ 问题,有没有可以帮助加密/身份验证的库?

安全对我来说是个问题,所以我想确保我做对了。

也许是一些背景信息。这是一个游戏服务器,一个人用他的帐户登录并被带到一个“大厅”,在那里他可以选择一个“世界服务器”来玩。世界服务器是一个单独的进程(可能)在同一网络中的不同机器上运行。

出于这个原因,我想在其中有一个 session 的概念,用户登录并生成一个 session ,登录服务器将 session 中继到用户选择的世界服务器,以便世界服务器知道用户实际上已登录。

我认为客户端必须确认与世界服务器的 session 以及所有这些,但我稍后会担心。

真诚地,杰西

最佳答案

您通常想通过链接发送密码,即使加密也不行。通常的方法是挑战-响应协议(protocol)。

  1. 客户端连接到服务器,发送用户名(但不是密码)
  2. 服务器通过发送唯一的随机数来响应
  3. 客户端使用密码的哈希值作为 key 对该随机数进行加密
  4. 客户端将加密后的随机数发送给服务器
  5. 服务器使用用户密码的正确哈希加密随机数
  6. 服务器比较两个加密的随机数

这有几个优点。首先,这意味着密码永远不会以任何形式通过链接。其次,它不受重放攻击的影响——如果攻击者记录了对话,他们以后就不能重放客户端的回复来登录,因为随机数会改变。

保护连接(即加密内容)要简单一些。通常,两者中的一个(实际上并不重要)选择一个随机数,用另一个的公钥对其进行加密,然后将其发送给另一个。另一个解密它,然后他们使用它作为对称加密的 key 来加密 session 的其余部分。

库:BeecryptOpenSSL是几个明显的。除非您有相当具体的理由不这样做,否则您可能想要使用 TLS(它比我上面概述的要多得多,包括双向身份验证,因此服务器不仅知道客户端是谁是,但客户端也知道服务器是谁,因此可以合理地验证它没有连接到可能只是收集他的信用卡号码并使用它运行的其他人。

编辑:

要验证每个数据包而不需要加密所有内容的开销,您可以执行以下操作:

  1. 服务器将其公钥与质询一起发送
  2. 客户端生成一个随机数,使用服务器的公钥对其进行加密,并将其与响应一起发回
  3. 该数字是用于反模式加密的第一个数字
  4. 客户端在其发送的每个数据包中都包含一个计数器模式结果

计数器模式意味着您只需生成连续数字,然后使用正确的 key 依次加密每个数字。在这种情况下, key 将是客户端密码的哈希值。这意味着每个数据包都将包含一个唯一的随机数,客户端和服务器都可以生成该随机数,但没有其他人可以生成。通过使用计数器模式加密,每个数据包将有一个唯一的随机数。通过从一个随机数开始,每个 session 都会有一个唯一的随机数序列。

为了最大程度地减少开销,您可以在每个数据包中只发送一部分结果 - 例如,如果您在计数器模式下使用 AES,它将为您加密的每个数字生成 16 个字节的结果。每个数据包仅包含(例如)两个字节,因此您只需每 8 个数据包加密一次数字。从理论上讲,这会降低安全性——攻击者可以只尝试一个数据包的所有 65536 个可能的值,但如果您假设连接在(例如)两次错误尝试后被破坏,那么攻击者获得正确值的机会就会变得非常小(当然,您几乎可以通过控制允许的错误尝试次数和每个数据包中包含的身份验证大小来选择愿意接受的机会)。

关于c++ - 使用套接字在 C++ 中进行客户端到服务器身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11580944/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com