在线游戏:一个快速但不太安全的加密哈希/JavaScript中的校验和函数?

在线游戏:一个快速但不太安全的加密哈希/JavaScript中的校验和函数?,javascript,networking,cryptography,hash,Javascript,Networking,Cryptography,Hash,我不需要它太安全。即使是md5,它通常是坏的,也比我需要的安全(只要在2分钟内找不到碰撞,它应该是100%好) 我需要它来制作一个视频游戏,我们将在本周末的黑客大赛中制作。我们有一个模拟游戏核心部分的服务器,我们需要同步多个玩家(我们使用socket.io和nodejs作为comet服务器),并确保没有玩家通过修改值作弊。因此,校验和(如果他们发送一个有效的校验和,它将与服务器中生成的校验和进行比较,则用户拥有正确的内容) 因此,只要校验和不太容易反向工程,它就应该是好的 另外,由于我对在线游戏

我不需要它太安全。即使是md5,它通常是坏的,也比我需要的安全(只要在2分钟内找不到碰撞,它应该是100%好)

我需要它来制作一个视频游戏,我们将在本周末的黑客大赛中制作。我们有一个模拟游戏核心部分的服务器,我们需要同步多个玩家(我们使用socket.io和nodejs作为comet服务器),并确保没有玩家通过修改值作弊。因此,校验和(如果他们发送一个有效的校验和,它将与服务器中生成的校验和进行比较,则用户拥有正确的内容)

因此,只要校验和不太容易反向工程,它就应该是好的

另外,由于我对在线游戏没有太多经验(尽管我已经在C、Java、Python甚至PHP中使用套接字有一段时间了),如果有人能推荐一些关于遵循的一般模式的阅读资料,那就太棒了。我找到的只是一篇文章,解释了《帝国时代2》在线版有点糟糕的原因:)

非常感谢

更多硼化:

每个客户机都有变量(具有属性的对象等)。事件发生在客户端,因此状态发生变化。根据状态,变量会发生变化。因此,客户机向服务器发送状态和变量哈希。服务器从客户机获取新状态(例如,“右箭头按下”),检查它们是否有效,然后在变量上生成新值。检查哈希值是否与客户端发送的哈希值对应。如果没有,它将向客户机发送一条同步消息,为其变量提供新值。然后保存所有内容,并向共享变量上的其他客户端发送更新。(因为并非所有变量都能被其他客户端看到)

散列主要用于同步。我不知道这是否是最好的方法,但这是我想到的。然而,如果这些值只是一个简单的校验和(例如CRC32),而不是更难伪造的值,我不希望它们被刺伤。这样我觉得同步会更容易


再说一次,我没有在电子游戏上联网的经验,但从我做过的其他事情来看,这听起来是合乎逻辑的。感谢所有反馈。

不要信任客户。将服务器用作中心权限,不是用于核心部件,而是用于所有部件。在服务器端复制尽可能多的游戏状态,并向客户端提供这些数据。不要在客户端进行任何处理/尽可能少地进行处理。无论客户端修改什么值,服务器都会拒绝它们

我不建议采用这种方法。如果在客户端进行任何加密,则它是不安全的。 我建议采用一种方法,制作一个存储在服务器上并生成的所有可能的操作列表。当玩家执行任何动作时,对可能的动作列表进行更改。当播放器浏览器向您发送任何动作数据时,它会根据可能的动作列表(如权限表)进行检查,如果允许动作,则使用regex和其他输入数据进行验证。 如果您对保护数据流感兴趣,那么使用SSL。
最后一件事是对数据流使用公钥/私钥加密。

如果您是从客户端上的操作生成哈希,那么无论算法的加密安全程度如何,客户端始终可以操作值并生成新的有效哈希。他们不需要对用于创建验证令牌的方法进行反向工程——您已经为他们提供了生成虚假令牌的代码


这只剩下在服务器上生成一组验证令牌、将它们发送给客户端并允许客户端返回相关令牌的选项——如果您这样做,那么与对称加密或甚至随机值相比,使用散列没有任何净好处。

评论太多了,因此,张贴一个答案,这是更多的问题

很难说清楚你到底想保护什么。如果您想要的只是消息同步。。。您是否可以自由使用TCP,并让协议处理它?如果那是你计划做的,那么我完全不知道你的问题是什么

如果不是,但您不能使用TCP,那么同步消息可能比您想象的更重要,尤其是在LAN环境中;你用“hackathon”这个词,但我不知道那到底是什么意思。。。但你是否真的在考虑防止其他玩家的恶意/恶作剧行为,他们可能发送伪造的数据包?(如果正在使用UDP,则通过LAN执行非常简单的操作)

如果是这样的话,你必须考虑的不仅仅是获得一个“安全”的方法来保证同步;在对所有消息执行任何操作之前,您还需要验证它们的来源,因为UDP/IP中的IP“source”信息除了知道在哪里发送回复之外几乎一文不值。您不能基于源IP假设任何内容

(我在这里的意思是,由于TCP/IP的“基于连接”的特性,而不是UDP/IP的孤立数据报;UDP使得在封闭环境中(如您所描述的)发送可能造成严重破坏的恶意数据报变得很容易。)

如果这是你所需要的,你通常是在正确的树上吠叫;你想要一些快速的东西,并且“足够安全”以防止快速分析;这些数据是一种你不在乎是否有人能在一个小时内查看并找出某人在任何给定时刻按下的按钮的数据——你只想防止有人发送伪造的或伪造的DOS数据包

因此,每个客户机/服务器连接都应该有一个共享的随机salt,该salt至少应该在每个“会话”中重新生成。散列发生,消息发送时带有散列的“签名”——用盐散列的消息。当接收者收到该消息/签名时