如何在分布式程序中对消息进行数字签名和信任我知道可以进行逆向工程?

时间:2009-06-08 10:52:00

标签: encryption digital-signature

问题简述:我开发了一个以二进制形式分发的应用程序(例如游戏)。游戏呼叫回家并将用户的高分作为消息发送到在线游戏服务器。

我想做的是对邮件进行数字加密和签名,以便我可以相信它没有被篡改过。

公钥加密依赖于会话的每一端都有一个秘密,但我不能依赖我的软件不进行逆向工程,并发现私钥。

当我知道它可以进行逆向工程时,是否存在安全或安全的数字签名方式(在这种情况下,加密部分不是必需的)来自我的分布式二进制应用程序的消息?

7 个答案:

答案 0 :(得分:3)

简而言之:不......没有万无一失的解决方案。问题是,向您发送高分的应用程序正在您不在此事务中“信任”的人的控制下运行。如果他们可以对代码进行反向工程,那么他们可以在签名之前更改任何消息的内容。

答案 1 :(得分:1)

一旦你的程序的代码(无论是来源,中间语言或机器代码)在别人的手中,他们就可以做任何他们想做的事情,你不能确定他们不会滥用它。为了更加困难地使用所有可能的方法来使逆向工程变得更难,但这并不能保证你不会滥用。

答案 2 :(得分:1)

你不能。这个问题没有真正的解决方案,只是越来越多的混淆和篡改检查(恕我直言,这只是浪费时间)。假设每个程序都可以进行逆向工程,模拟和篡改。你无能为力。

我能想到保持游戏结果免受篡改的唯一方法是发送某种可以重播和得分验证的游戏记录。但是,这并不能保护您的游戏免受机器人的影响。这只适用于你的游戏世界是完全确定的。

答案 3 :(得分:0)

没有。要使客户端软件对其进行数字签名,它必须具有私钥。如果软件具有私钥,则用户可以发现(并可能滥用)它。

答案 4 :(得分:0)

使用一些已知算法,在我的应用程序中我使用blowfish。但这不是什么使它安全。

游戏通常有一个检查连接到服务器的程序的标识的过程,该过程称为“握手过程”。服务器发送一个数据包,它包含值和加密(客户端知道如何解密)在每次连接时,从服务器收到的河豚钥匙是随机的。这是握手的第一部分。

下一部分是根据在connect上接收的值(随机)加密计算的整数,然后用blowfish加密它。

当服务器收到该数据包时,服务器发送相同的数据包,该数据包使用新的(最终)河豚钥匙加密。客户端必须通过使用旧的blowfish密钥解密该密钥,然后使用从第一个数据包收到的值。

这是握手过程,在完成后你可以在相同的主体上发送你的分数(或者可能把它放在握手中并在对傻瓜反向器进行握手后发送假包。)

要做的事情太多了,但对于反向者来说要么太多了。

解决问题的另一种方法是根据数据包内容添加一个双字节(字)安全值(CRC)和您自己的计算。服务器将检查该值以及它是否无效 - >断开连接。

答案 5 :(得分:0)

好问题!这里有很多人已经说过 - 你最终需要在你的应用程序中构建一个可以通过逆向工程检索的密钥。

阅读Trusted Computing。它围绕PC内置的公钥/私钥构建 - 您的PC永远不允许您访问。内存挂起/密封存储会使攻击者难以尝试发现传送到您应用的密钥。

答案 6 :(得分:0)

不,不是一般的。你面对其他评论中提到的问题。

问题变成了成本问题。破解保护系统的成本是否高于其保护的价值?从成功的闯入中恢复的成本是多少?

由于高分表通常不是高价值目标,您可能想尝试其中任何一个:

  1. 随着高分,发送一些游戏状态信息;播放时间,级别,收集的奖金等。加密/混淆这些数据。这将有助于服务器确定高分在理论上是否有效。忽略任何显然是伪造的高分。

  2. 使用带有共享密钥的加密发送高分。不要将共享密钥作为纯文本存储在应用中。优选地,使用算法来实时计算它。

  3. 模糊您的客户端代码。

  4. 使用客户端IP地址和时间戳存储高分。