Jes*_*nds 20 c++ sockets authentication encryption
我正在为我的小型服务器客户端程序实现一个登录/身份验证系统.我想知道如何解决这个问题,我希望能像往常一样从Stack Overflow获得一些很棒的建议/建议.这就是我想象的我会做到的.
这是一种安全的方式吗?我想客户端还会发送一个串行密钥或其他类似的密钥来形成一个串行/令牌对,这样另一个客户端就不能伪造相同的令牌(尽管令牌是由服务器端生成的).
实现细节不是必需的,因为我能够执行.
相反,我的问题是两个问题:
安全对我来说是一个问题,所以我想确保我做得对.
也许一些背景资料.这是一个游戏服务器,一个人用他的帐户登录并被带到"大厅",在那里他可以选择一个"世界服务器"来玩.世界服务器是在同一网络中的不同机器上运行(可能)的单独进程.
出于这个原因,我希望在此有一个会话的概念,用户登录并生成会话,登录服务器将会话中继到用户选择的世界服务器,以便世界服务器知道用户实际上登录.
我估计客户端必须确认与世界服务器的会话以及所有这些,但我稍后会担心.
真诚的, 杰西
Jer*_*fin 31
您通常不希望通过链接发送密码,甚至不加密.通常的方法是挑战 - 响应协议.
这有几个优点.首先,这意味着密码永远不会以任何形式通过链接.其次,它不受重放攻击的影响 - 如果攻击者记录了对话,他们以后无法重播客户端的回复进行登录,因为随机数会发生变化.
保护连接(即加密内容)稍微简单一些.通常情况下,两个中的一个(实际上并不重要)选择一个随机数,用另一个公钥加密它,并将其发送给另一个.另一个解密它,并使用它作为对称加密的密钥加密会话的其余部分.
库:Beecrypt和OpenSSL是一些显而易见的问题.除非你有一个相当具体的理由否则,你可能想要使用TLS(它比我上面概述的要多得多,包括双向身份验证,因此服务器不仅知道客户端是谁是的,但客户也知道服务器是谁,所以它已经合理地验证它没有连接到可能只收集他的信用卡号并与之一起运行的其他人.
编辑:
要在不加密所有内容的情况下对每个数据包进行身份验证,您可以执行以下操作:
计数器模式意味着您只需生成连续的数字,然后使用右键依次加密每个数字.在这种情况下,密钥将是客户端密码的哈希值.这意味着每个数据包将包含客户端和服务器都可以生成的唯一随机数,但没有其他人可以.通过使用计数器模式加密,每个数据包将具有唯一的随机数.通过从随机数开始,每个会话将具有唯一的随机数序列.
为了最大限度地减少开销,您可以只为每个数据包发送一部分结果 - 例如,如果您在计数器模式下使用AES,它将为您加密的每个数字生成16个字节的结果.每个数据包仅包含(比方说)两个字节,因此您只需每8个数据包加密一次.从理论上讲,这会降低安全性 - 攻击者只能尝试数据包的所有65536个可能值,但如果您认为连接在(例如)两次不良尝试之后已被泄露,则攻击者获得正确值的机会变得非常小(当然,通过控制允许的错误尝试次数和每个数据包中包含的身份验证大小,您几乎可以选择您愿意接受的机会).
| 归档时间: |
|
| 查看次数: |
16839 次 |
| 最近记录: |