您使用什么来捆绑/加密数据?


14

越来越多的游戏正在采用数据驱动的路线,这意味着围绕易操纵性需要有一层安全性。我已经看到游戏完全捆绑了它们的资产(音频,艺术,数据),并且我想知道它们如何管理资产?是否有应用程序/库将捆绑并帮助您管理其中的资产?如果没有,您将指向打包/拆包/加密的任何良好资源吗?

这个特定的问题围绕C ++展开,但是我很乐意听到如何在C#/ XNA中对其进行管理。

只是要清楚-我不会设计出一种防止黑客入侵的解决方案。从根本上讲,我们都在操纵0和1。但是,我们确实希望阻止99%的玩游戏的人简单地修改用于构建游戏世界的XML文件。我已经看到很多游戏将所有资源捆绑在一起。我只是对他们使用的方法感到好奇。


好问题,虽然我不相信有一种方法可以100%保护它,但我确实相信有一种整齐的方法来压缩和混淆它,我想知道更多有关它的信息
Prix

值得质疑的是,您的艺术/音频资产是否应该被认为是“敏感的”。许多游戏故意将其资产暴露给玩家,以支持健康的Mod社区,这反过来又可以为游戏增添更多价值(即使对开发者而言,几乎不付出任何代价)。
伊恩·施雷伯

我主要关注驱动数据驱动游戏的敏感数据(例如xml文件)。我刚刚看到游戏将所有内容捆绑到一个或两个文件中。
大卫·麦格劳

4
玩家玩弄这些数据怎么了?
jsimmons

击败我自己的鼓。CFL
Jari Komppa

Answers:


8

一个好的策略是从头开始创建自己的存档格式,并使其成为具有索引的索引,其中包含指向数据块的表,而不是将整个顺序文件存储在存档中,然后加密索引表并使用LZMA /分别压缩每个块Bzip2。

另一种方法是在各处使用过程数据生成器的一部分(如果您想走得更远,甚至可以从在线服务器上获得所述生成器的“参数”作为一种额外的措施),然后通过分流一些工作在GPU上,您还可以防止内存溢出,并弥补部分性能损失。

但是,我发现这样的技术通常会阻碍性能并浪费开发时间,同时始终为最终用户提供任何潜在的问题和不必要的错误,却无济于事。

但是,没有什么是100%安全的。


为此+1。压缩既可以满足混淆需求,又可以缩短加载时间和应用程序占用空间。数据的存档/打包无论如何都将需要一个抽象层,因此将其与可以在适当位置加载/解压缩的内容组合起来应该不会花费太多工程。如果确实要进行压缩,那么请确保将压缩/解压缩逻辑与加载/归档逻辑分开。这样,您以后就可以交换更好的算法,所需的基础结构在算法之间不会改变。
MrCranky

@MrCranky:如果您查看EA使用其.package(DBPF)存档格式(在SPORE和The Sims游戏中使用)的方式,那么您实际上会看到这一点。他们的引擎在索引表中有一个用于“压缩类型”的额外字段,这是使用哪种算法的内部代码。他们基于块类型使用不同的压缩算法(例如,文本块使用特殊压缩)。他们使用的版本控制系统还允许集成mod和向后兼容。有关DBPF格式的更多信息,请访问:simswiki.info/DatabasePackedFile
voodooattack 2010年

有趣的东西:我只在编译时使用#define做到了,但是运行时带来了一些不错的可能性(例如能够更改压缩类型而不必为游戏重建每个文件)。
MrCranky 2010年

11

不要运送敏感数据。

没有办法出货加密的数据,使得只有游戏可以访问它。您可以尽力而为,但很快就会遇到DRM问题。

如果您想避免游戏资产被窥视。

  1. 压缩它
  2. xor 文件
  3. 将扩展名更改为无聊的内容(即不my_level.zip.xor使用my_level.map)。

这将阻止95%的恶作剧用户。不管您做什么,其他5%的用户都会得到它。
您实际上不需要压缩和压缩xor。您可以改为lzma并使用具有已知密钥的AES。关键是不要花很多时间在上面。


这就是我通常在大多数游戏中看到的...给您的Cookie。
Prix

2
实际上,只需zip + rename就足够了。
coderanger 2010年

1
我不这么认为,我喜欢That will stop 95% of mischeivieous users.突破,尽管我确实相信,仍然会有人真正得到它,如果不是所有人都能够,我将不胜感激。这些天来,大多数10岁的孩子都知道如何在记事本中打开文件并将其重命名...
Prix​​ 2010年

1
知道如何,是的。会在乎的,不会。
coderanger 2010年

zip + rename是不够的。Linux很少使用文件扩展名来确定文件类型。相反,它查看前几个字节,并使用该字节来确定其类型。在Linux中,重命名的zip仍显示为zip。Windows XP不会执行此操作,它仍使用扩展名。我不知道Windows7是如何做到的,但是我希望将来Windows将使用类似的技术。
deft_code 2010年

4

在此上花费大量时间可能是愚蠢的。有一些工具可以直接从GPU获取纹理和模型数据,并且声音可以轻松指向虚拟回送设备。任何需要真正安全的东西都必须存在于服务器上,并且只能通过质询/响应来工作。进行客户端数据验证是另一回事,更像Valve的-verify_all。这仍然很困难,因为您不能信任本地可执行文件来强制执行它(或者至少您不能信任它,而不是信任端点防作弊系统,这也是一个愚蠢的想法)。


4

我的工作是使用防篡改软件。我认识某人,他是一位老派的游戏爆竹。他像呼吸一样玩游戏。你不能阻止像他这样的人。如果您的游戏足够流行,那么无论您做什么,游戏的多个破解版本仅会在发布后几天出现在torrent网站上。我的建议是,尽量做到最低限度,以防止那些认为自己可能希望挫败这种逆向工程的普通乔。


1
这就是目标。我绝对不希望与黑客作斗争。
大卫·麦格劳

1

好的问题,但这很难回答。
根据我在数据安全方面的经验,您必须考虑以下方面:

1)您要保护的内容是什么,如果数据不安全,会对谁造成什么影响?与系统技术解决方案相比,安全性更重要的是风险评估
2)在这种情况下,我假设您的平台是台式机(例如Windows / OSX)与专用硬件(例如PS3 / Xenon)不同的问题空间,后者在内核级别的安全性方面有自己的尝试(这是否是有效的解决方案尚待商))
3)加密=安全性。加密仅保证不能读取您的数据,也不保证不能写入或重放/代理您的数据。

如果您的要求是防止数据被篡改,则需要考虑对数据进行哈希处理(最好使用SHA-256或SHA-512)。要再次重申,请考虑为什么它很重要,以及从增加安全性中获得的好处系统。
值得一提的是,由于出口限制(将加密技术归类为受限武器等级技术,无论是否相信),将加密技术添加到您的产品中可能会产生法律影响,因此建议使用克服了这些法律问题的库。
最后-永远不要使用自己的加密技术-使用众所周知的,已记录的,经过研究的算法,例如AES,Blowfish,RSA等

ps公钥/私钥不适用于加密大量数据,因此DRM / PGP等使用混合RSA + 对称系统,即使用RSA保护对称密钥,然后使用该密钥进行标准对称加密

这是一个非常大的复杂主题,我绝对没有做到公平

希望能有所帮助


1

如果您想要一个为小巧(可压缩),可笑的安全性和灵活性而设计和制造(可能过度设计)的格式的示例,则应使用暴雪的MPQ格式。

http://wiki.devklog.net/index.php?title=The_MoPaQ_Archive_Format

常规存档布局如下:

存档头文件数据文件数据-特殊文件哈希表块表扩展块表强数字签名

此格式包含所有内容。可分组的,可扩展的可分组的,将数据划分为多个扇区(以便于流式传输),支持可以任意组合的7种压缩算法(如果算上声音压缩),弱数字签名,强数字签名等。

如果您要从Blizzard购买涉及文件体系结构的API,那么您将获得所需的一切,还有更多。


感谢您提供的链接,我从没想过要进一步研究MPQ的详细信息(并且通常会假设它们不可用)
法案

如果它是如此安全,为什么还要对它进行反向工程到这样的程度,甚至还要有第三方库与之交互?;-)
coderanger 2011年

与* .mpq文件进行交互的大多数(阅读:全部)工具取决于Stormlib,该文件由一个人编写和维护。

据我所知,Stormlib要求您拥有存档源的原始游戏,因为解密密钥存储在可执行文件中。但是,它如此安全的最大原因不是因为它不可能被破解。但是对于通过网络发送的实时数据,它是首屈一指的。数据被高度加密,以至于第三方即时解密是徒劳的。

实际上,借助“魔兽世界”,暴雪率先采用了流技术,使您仅需将全部数据的百分之一下载到硬盘上即可玩游戏。* .mpq格式在这种工作上表现出色。更不用说暴雪在游戏正式发布前几天发布了《星际争霸2》安装程序时,其档案已被高度加密,以致于直到游戏发行后才可以打开。:P

0

由于此问题最近已复活,因此您的问题(以及到目前为止的所有答案)似乎都只涉及文件加载,这与要加载的可执行文件一样安全。在PC上,没有什么是真正安全的(您只是拖延了人员),您可以检查服务器上的内容,但是即使该检查也可以删除,因此无论如何都可以运行修改后的exe。控制台仍然是“漂亮的”安全设备,因此在大多数情况下,我会生成重要文件的哈希,然后使用私钥对哈希进行签名,将公钥嵌入代码中,并针对文件验证安全哈希。

我以为我会在对话中再发起一次攻击,去年才遇到这种情况,因为我不太倾向于在PC上发布。Cheat Engine是一个非常简洁的小程序,几乎可以自动进行您自己的黑客攻击(这意味着任何人都可以使用它)。它的功能相当先进,据我所见,人们出售的许多骇客/作弊都是由这种或我所看到的东西(所有大众市场的东西)造成的。通过一些工作,您可以再次防止这种情况发生,我想这全都取决于游戏的受欢迎程度以及是否有人足够在意。

Opps,忘了提到一个很好的用于加密的库(在C ++中)是LibTomCrypt

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.