【发布时间】:2015-12-23 17:09:42
【问题描述】:
[此问题与登录凭据或用户/玩家输入任何类型的密码短语等无关;谢谢你,继续阅读。]
首先,我的问题已经有人问过了,here 和 here。不过,我的问题与其中任何一个都不同,因为我没有通过互联网连接来获取数据或关心任何类型的“登录”。尽可能简单地说,我正在制作一个游戏,我的游戏资源都被加密成专有格式,需要一个密码来解密数据。我必须在源代码中隐藏该密码。除了将密码保存在应用程序本身之外,我想不出任何其他方法。在另一个文件中加密密码仍然需要一个密码,而这只是开始了隐藏密码的无限循环,等等。
这让我想知道,现代游戏如何处理他们的资源解密密码?想想使命召唤、上古卷轴、侠盗猎车手等游戏。他们加密他们的数据,对吗?这意味着他们需要密码/盐/等来解密它。这样的密码也需要在可执行文件中。 那么他们把它藏在哪里呢?他们如何混淆它?
我考虑了一个选项,看起来它实际上会很不错。基本上,我会构造一个方法,该方法将通过一些奇怪的数学计算,构造一个字符串,并返回数据作为密码。有人可以直接从代码中提取该方法,然后在他们自己的私有应用程序中启动它,但至少它不会如此明目张胆:
public const string ResourceDecryptionPassword = "MY_AWESOME_DECRYPTION_PASSWORD";
另外,我考虑将密码保存为一个大的硬编码字节数组,我可以在应用程序启动期间将其转换回字符串。
任何人都可以提出任何其他解决此问题的方法吗?
另外,我忘了提一下:我的游戏源代码将被混淆。这很简单,因此它已经使直观地浏览代码变得困难。我只需要如何为我的加密资源隐藏密码的一个很好的解决方案。
【问题讨论】:
-
你认为游戏为什么会加密他们的资产?你说“数据”,但是什么样的数据呢?图片?保存文件?在应用程序中嵌入密钥永远无法得到合理的保护。我可以只使用 WinDbg 并在您调用
Decrypt或任何您调用的名称上放置一个断点,然后查看传入的密钥。您不需要源代码来调试应用程序。 -
@vcsjones Data = 图像、模型、着色器、资源、默认游戏数据。
-
所以你想分发具有唯一登录密码/密钥的离线游戏来解锁它?用户解锁游戏后是否可以更改此密码?或者这是在单个设备上一次性解锁?您可以只使用许可证管理器。或者您希望为每个发布的游戏使用相同的密码?
-
@Oceans 不,这不是我想要的。我希望我的资源被加密(已经实现)。我希望游戏能够解密我的资产。我的意图与登录凭据无关。我了解在可执行文件中完美隐藏密码是不可能的;我只是想知道我在可执行文件中存储密码的选择是什么(因此需要一些时间来发现,几周,几个月,甚至几年)
-
@Krythic,您想要一个在正确输入时可以访问您的程序的密钥/密码,即使与多人共享程序时所有人都将获得相同的密钥?我只是在仔细检查,因为将密钥存储在程序本身中并不安全。不管你加密多少,最终它总是有可能破解的。您可以使用时间作为参数使其动态化变得更加困难,但是如果您使用单个密码,那么人们也可以与他人共享此密码,而无需破解任何东西。所以我肯定会考虑让它依赖于用户