从客户端到服务器数据库更新游戏分数的最安全方法?使用Javascript

Sho*_*vik 13 javascript database cryptography client-server scoring

所以我有这个完全在客户端上运行的游戏.除了下载初始脚本以玩游戏之外,没有服务器交互.无论如何,在游戏结束时,我希望客户端将我应该在服务器数据库中更新的分数发回给我.现在我开始接受这样一个事实,即地球上没有任何办法我可以将其隐藏起来并将分数保持不变.但我想知道,直到我能在多大程度上修改整个过程,黑客操纵正在发送的数据几乎变得不可行.我肯定不希望得分作为客户端机器的纯文本发送,我不希望我的服务器执行复杂的解密算法.什么是最好的方式,因此实现相当大的安全性,每个汤姆迪克和哈里不破解分数...我希望有人可以提供一个很好的小方法,我可以工作...... :)谢谢

所以我的理想结果应该是 - >得到一个不受信任的一方(玩家)计算(得分)的可信结果!

-编辑-

有人告诉我一些关于在图片获取请求中隐藏数据的事情.就像,我在画布上实现这个游戏(html5).所以他在比赛结束时让我告诉我从我的服务器上取一个游戏而不是图像,他们的请求应该包含哈希分数.我并不完全理解整个过程,但如果你能解释一下,那真的很高兴!:)

coda ^所以你可以很好地掩盖请求

shouvik我该怎么做!?

coda ^您可以撰写要提交的校验和.像12312312a12313a232是你的md5,其中包含分数.像画布一样将资产带进画布

coda ^ server.com/images/md5_hash_of_score/congratulations.png

coda ^你可以通过htaccess重写服务器端

Mat*_*att 5

您似乎已经知道这一点,但只是要强调一下;您不能阻止某人这样做;您只能使其尽可能地艰难!

假设您当前将分数提交为:

/submit_score.php?score=5
Run Code Online (Sandbox Code Playgroud)

在Firebug中观看的人可以轻松地区分分数并进行更改。submit_score.php放弃它,参数名称也是如此。分数是一个易于区分的整数。

  1. 更改终点: /interaction.php?score=5
  2. 更改参数名称: /interaction.php?a=5

用户越来越难以确定正在发生的事情。

现在,您可以使得分更难(再次,更难,并非不可能)进行更改。首先,您可以对其进行加密(显然,稍后需要将其解密)。

  1. Base 64对其进行编码。
  2. 数字->字母(1 = a,2 = b等)。
  3. 颠倒分数表示的顺序。

您命名,就做到了。所以你现在有interaction.php?a=e

您可以做的下一件事是用其他方法对分数进行哈希处理。发送带有分数的哈希,然后在服务器上重新计算。例如,md5()带有随机字符串的分数,并在请求中发送分数(编码),字符串和哈希:

/interaction.php?a=e&str=abcde&hash=123456789abcefbc
Run Code Online (Sandbox Code Playgroud)

当请求到达服务器时,请执行以下操作:

if (md5($_GET['a'] . $_GET['str']) !== $_GET['hash']) exit;
Run Code Online (Sandbox Code Playgroud)

显然,人们可以(相对)轻松地浏览JavaScript代码并查看发生了什么;所以让他们在那里变得更难。缩小并混淆代码。

如果您对某人感到厌烦,他们将尝试理解您的JavaScript,尝试使用Firebug,不了解发生了什么,并且不会打扰;为了在游戏中获得一些额外的积分。


ype*_*eᵀᴹ 1

“现在我已经开始接受这样一个事实:我根本没有办法向黑客隐藏这一点并发送原样的分数。”

哦,是的,有!

您可以使用 RSA 或任何其他公钥加密方法(也称为非对称加密)。

为服务器创建一组(公钥和私钥)密钥。让您的客户端代码包含服务器的公钥。

在游戏结束时,客户端代码对分数进行加密(使用此密钥)并将两者(纯分数和加密分数)发送到服务器。

服务器解密并检查明文分数和解密分数是否相同。如果是,则接受分数。如果不是,则拒绝(中间有黑客或网络错误)。

-------更新----------更正--------------

正如 Ambrosia 所指出的,我的方法对于这种攻击完全失败了。

您真正想要的是从不可信方(玩家)进行的计算(分数)中获得可信结果。实现这一目标并不容易。

请参阅:http ://coltrane.wiwi.hu-berlin.de/~fis/texts/2003-profit-untrust.pdf

还有这个: http: //www.cse.psu.edu/~snarayan/publications/securecomputation.pdf

这个(需要订阅 ACM 数字图书馆):http://portal.acm.org/itation.cfm ?id=643477.643479

  • 人们仍然有可能看到公钥并生成他们自己的加密版本的分数,然后将其与完全匹配的明文分数一起发送,不是吗?沿着这条线的一个想法是,您可以使用代码到分数的映射,例如南瓜 = 1 分,番茄 = 2 等,并且只有服务器具有这些映射来确定分数。当然,如果您仍然向用户显示分数,并且他们可以在 firebug 中看到 ajax,则可以确定哪些单词(或代码)映射到哪些值。 (3认同)