我不需要太安全。即使md5,通常是破碎的,比我需要的更安全(只要在2分钟内找不到碰撞,它应该是100%罚款)。
我需要它来制作一个我们本周末将在黑客马拉松中制作的视频游戏。我们有一个服务器,它将模拟游戏的核心部分,我们需要同步几个玩家(我们使用socket.io和nodejs作为彗星服务器)并确保没有玩家通过修改值来作弊。因此校验和(如果它们发送有效的校验和,将与服务器中生成的校验和进行比较,用户就有正确的东西)。
因此,只要校验和不太容易逆向工程,它应该没问题。
另外,由于我没有太多的在线游戏经验(我已经在C,Java,Python甚至PHP中使用了一段时间),如果有人能推荐一些关于一般模式的读数,那将会很棒紧随其后。我找到的只是一篇论文,解释为什么帝国时代2的在线有点吸吮:)
非常感谢
更多阐述:
每个客户都有变量(具有属性的对象等)。事件发生在客户端,因此状态发生变化。根据状态,变量会发生变化。因此,客户端将状态和变量的哈希值发送到服务器。服务器从客户端获取新状态(例如,可以是“按下右箭头”),检查它们是否有效,然后在变量上生成新值。检查散列是否与客户端发送的散列相对应。如果没有,它会向客户端发送同步消息,为其提供变量的新值。然后保存所有内容并将更新发送到共享变量上的其他客户端。 (因为并非所有变量都可以被其他客户看到)
散列主要用于同步。我不知道这是不是最好的方法,但它是我想到的。但是,如果它们只是一个简单的校验和(例如CRC32)而不是更难以伪造的东西,我不希望乱搞这些值。这样我觉得同步会更容易。
同样,我没有关于视频游戏的网络经验,但是从我做过的其他事情来看,这听起来很合乎逻辑。我感谢所有的反馈。
答案 0 :(得分:3)
不要相信客户。使用服务器作为中央权限,不是核心部分,而是所有部分。尽可能多地复制游戏状态和服务器端,并向客户端提供数据。不要做任何处理/尽可能少的客户端。无论客户端修改什么值,服务器都会拒绝它们。
答案 1 :(得分:0)
这种做法我不建议。如果在客户端进行任何加密,则不安全。 我建议方法,制作一个在服务器上存储和生成的所有可能的动作列表。当玩家执行任何操作时,会对可能的操作列表进行更改。当播放器浏览器向您发送任何操作数据时,将检查可能的操作列表,如权限表,如果允许操作,则使用正则表达式,其他输入数据进行验证。 如果您对保护数据流感兴趣,请使用SSL。 最后一件事是使用公钥/私钥加密进行数据流。
答案 2 :(得分:0)
如果您正在从客户端上的操作生成哈希值,那么算法的加密安全性无关紧要 - 客户端始终可以操作值并生成新的有效哈希值。他们不需要对用于创建验证令牌的方法进行反向工程 - 您已经为它们提供了生成伪令牌的代码。
只留下在服务器上生成一组验证令牌,将它们发送到客户端并允许客户返回相关令牌的选项 - 如果您这样做,那么使用时没有净利益哈希与对称加密甚至随机值进行比较。
答案 3 :(得分:0)
评论的想法太多,所以发布一个更多问题的答案;
很难确切地告诉你在这里要保护什么。如果你想要的只是消息同步...你是否可以自由使用TCP,并让协议处理它?如果那是你打算做的事情,那么我完全不知道你的问题是什么。
如果没有,但你不能使用TCP,那么同步消息可能比你想象的更重要,特别是在局域网环境中;你使用“黑客马拉松”一词,但我不知道这究竟是什么意思......但是你真的想要防止其他可能发送欺骗数据包的其他玩家的恶意/恶作剧行为吗? (如果使用UDP,则在LAN上执行非常简单)
如果是这种情况,您必须考虑的不仅仅是获得确保同步的“安全”方法;你还需要在对它们做任何事情之前验证所有消息的来源,因为除了知道在哪里发送回复之外,UDP / IP中的IP'源'信息几乎一文不值。您不能根据源IP假设任何内容。
(我的意思是,由于基于'连接'的TCP / IP性质而不是UDP / IP的隔离数据报; UDP使得在一个封闭的环境中很容易,例如你描述的发送恶作剧的数据报这可能会造成严重破坏。)
如果这就是你所需要的,你通常会吠叫正确的树;你想要快速的东西,并且“足够安全”以防止快速分析;数据是一种你不在乎的人,如果有人可以查看它一个小时,并弄清楚某人在任何特定时刻按下了什么按钮 - 你只是想阻止某人发送伪造的或伪造的DOS数据包。
因此,每个客户端/服务器连接都应该有一个共享的随机盐,至少应该在每个“会话”中重新生成。发生散列,并使用散列的“签名”发送消息 - 消息与盐一起散列。当接收者获得该消息/签名时,它接收消息并与salt进行相同的散列,其结果必须与发送的签名匹配,否则消息将被欺骗。