首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >防黑客系统:减少服务器开销和防止OCR

防黑客系统:减少服务器开销和防止OCR
EN

Stack Overflow用户
提问于 2014-06-02 11:12:09
回答 2查看 312关注 0票数 0

注:我被否决了,因为这个帖子太模糊了。下面我提供了大量的研究资料。向下滚动答案,找出准确的问题。

我正在写一个实时多人纸牌游戏。游戏的所有逻辑都在服务器上。不过,我担心黑客会利用这个游戏。我想要一个非常强大的保护,因为我希望它是一个付费的比赛游戏在一点。

小小的介绍

这是一个基于转弯的游戏。目标是拿到所有的卡片。每个玩家都有一包他们看不到的牌。一次又一次地转动,他们把卡片放在板的中央,露出一张牌。其中一条规则是,如果两张相同类型的牌(A-A,K-K,9-9)出现,任何人都可以点击,而第一次点击就赢了。

它是如何工作的

客户端接收socket.io“卡”事件。事件数据包含牌类、牌号和丢弃它的玩家的id。

event : {rank : "Ace", kind : "Spades", playerId : 3}

当客户端接收到它时,Phaser将加载相应的sprite映像并将其显示在板上。

也许你看到问题了。对于黑客来说,识别两个级别相同的连续事件很容易,例如:

{rank : "Ace", kind : "Spades", playerId : 3}

{rank : "Ace", kind : "Hearts", playerId : 4}

看"Ace","Ace"?那太容易辨认了。

策略1:对精灵的加密

然后,我想也许我会加密“精灵”本身,并发送,连同“卡”事件,密钥和文件名解密。“卡片”事件现在看起来应该是:

代码语言:javascript
运行
复制
{sprite : "randomFileName", key : "aSecretKey", player : 3}

但是,我再次意识到,一旦文件被解密,它将几乎一样容易。在游戏中的一段时间后,所有的卡片至少会出现一次,允许黑客将每一个精灵文件与相应的等级联系起来。例如:

代码语言:javascript
运行
复制
randomFileName1 -> King
randomFileName2 -> Ace
randomFileName3 -> Jack

战略2:精灵的更新

为了防止这种情况,我想,一旦玩家解密了一张卡片,他就无法再次识别它,因为他的客户会下载几个新加密的精灵。renewalRate是在使用一张卡后从服务器下载的卡数。

例如:

客户端的雪碧()

代码语言:javascript
运行
复制
// These are the sprites files on the client side.
// User doesn't know yet what they are 
// ? : means the user doesn't know what it is
// (): contains the id of the card
Sprites : 

   randomFileName1 -> ?  (King)
   randomFileName2 -> ?  (Ace)
   randomFileName3 -> ?  (Jack)

客户端接收事件

代码语言:javascript
运行
复制
// An event from the server
Event : 

   {
       fileName : "randomFileName2"

     , key : "randomFileName2Key"

     , playerId : 3

     // The number of files to renew would be equal to the "renewalRate" variable
     // The higher the renewalRate, the less chance the user can identify
     // a resource after it was re-downloaded.
     , renew : [randomFileName1, randomFileName2] 
   }

用户现在可以识别Ace

代码语言:javascript
运行
复制
// User can identify randomFileName2 as an Ace because he could decrypt it
// And display it
Sprites : 

   randomFileName1 -> ?   (King)
   randomFileName2 -> Ace (Ace)
   randomFileName3 -> ?   (Jack)

用户更新Ace文件和其他一些文件,以混合

代码语言:javascript
运行
复制
// User renews files randomFileName1 and randomFileName2 
// as specified in the event.
//
// This way, he doesn't know no more which of the new file is the "Ace"
// Ace has 50% chance of being randomFileName4 or randomFileName5
// In general, a card has 1/(renewalRate) chance of 
// being identified after renewal. 
//
// In this case, renewalRate = 2.
// So chances to identify the Ace is (½ = 50%) among randomFileName4 and 5
Download

 x randomFileName1 -> ?   (King)
 x randomFileName2 -> Ace (Ace)
   randomFileName3 -> ?   (Jack)
 + randomFileName4 -> ?   (Ace)  -> the consumed ace is redownloaded here
 + randomFileName5 -> ?   (King) -> Another card is renewed    

客户端的雪碧()

代码语言:javascript
运行
复制
Sprites : 

   randomFileName3 -> ?           (Jack)
   randomFileName4 -> ? (Ace 50%) (Ace)
   randomFileName5 -> ? (Ace 50%) (King)

战略3:延迟更新精灵

为了避免这种情况,我想我可以以延期的方式更新卡片,这意味着重新下载的卡片不一定包含以前使用的卡。这需要客户端下载同一张卡的多个版本:

**客户端的雪碧**

代码语言:javascript
运行
复制
   randomFileName1 -> ? (King)
   randomFileName2 -> ? (Ace)
   randomFileName3 -> ? (Jack)

事件

代码语言:javascript
运行
复制
Event : 

   {
       fileName : "randomFileName2"

     , key : "randomFileName2Key"

     , playerId : 3

     , renew : [randomFileName1, randomFileName2] 
   }

客户端的雪碧()

代码语言:javascript
运行
复制
   randomFileName1 -> ?   (King)
   randomFileName2 -> Ace (Ace)
   randomFileName3 -> ?   (Jack)

用户下载新精灵

当用户下载新的精灵时,消耗的卡片( Ace)不一定包含在新的精灵中。它可能下一次下载,或者第二次-下一次用户消费卡。

代码语言:javascript
运行
复制
Download

 x randomFileName1 -> ?   (King)
 x randomFileName2 -> Ace (Ace)
   randomFileName3 -> ?   (Jack)
 + randomFileName4 -> ?   (3)
 + randomFileName5 -> ?   (9)

下一圈

代码语言:javascript
运行
复制
Download

 x randomFileName3 -> ?   (Jack)
 x randomFileName4 -> 3   (3)
   randomFileName5 -> ?   (9)
 + randomFileName6 -> ?   (Ace) //Ace is re-downloaded now
 + randomFileName7 -> ?   (10)

问题所在

服务器开销

一张纸牌精灵:5-10 by移动换牌数量:一款游戏消耗3张卡/秒:2张游戏: 30张总计:900 by/s-1,800 by/s

服务器开销很大。1,800 be /s可能有点重。只有30场比赛在进行。

OCR

而且,在这个系统中,即使玩家不能通过文件名来识别一张牌,一旦他收到了密钥,他可能会运行一个OCR来识别牌级,并且也会赢。

我的问题

在这种情况下,是否有加密策略或其他策略可以使我减少服务器开销,并防止用户在映像上运行OCR?

EN

回答 2

Stack Overflow用户

发布于 2014-06-02 15:53:01

一种简单且不太复杂的方法是有一种加密数据的方法,并经常改变加密数据的方式。可以将当前的time+20秒用作哈希的秘密。或应用程序中将在客户端和服务器之间同步的一些数据。一个移动变量,服务器和客户端可以在文件名的哈希过程中一起使用,这样在客户端和服务器之间哈希是相同的,但是在2分钟后,哈希对于相同的卡名将是不同的。时间可能不是最好的选择,但它是一个获得全球理念的例子。

这样,你的精灵的加密名称每次都会改变。

我不确定我是否把我的观点说清楚了。

代码语言:javascript
运行
复制
crypto.createHash('sha256').update(filename+"(-)="+currentTime+20).digest('hex');

您发送此散列,然后与客户端一起,对每个文件名进行散列,并使用接收到的散列进行测试,以便您能够找到要加载的好的sprite。

票数 0
EN

Stack Overflow用户

发布于 2014-06-02 17:43:46

除非我遗漏了什么,否则这是一个基于普通牌牌的游戏。

为什么整个组件不被客户端预先下载为图像(也可以缓存服务器端),并且在请求/响应中只将元数据(哪张卡的文本/json/xml表示等)发送回客户端。处理来回发送的文字卡图像不是这样的问题,您可以集中精力保护数据。

在防止玩家作弊方面,不要让这个无状态的服务器端。管理整个游戏服务器端,只处理来自用户操作/事件的请求。在那里,您可以检查操作是否有效,以及它们的接收顺序。

假设玩家更改了请求中的数据(很容易做到),那么您就知道他们到底有哪些牌,以及正在玩什么牌,所以您可以轻松地减轻这种情况。

若要防止其他玩家看到其他人的卡,请使用SSL。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23993175

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档