处理资源解密密码

时间:2015-09-25 19:37:18

标签: c# security passwords

[此问题与登录凭据或用户/播放器输入任何类型的密码等无关;谢谢你并继续阅读。]

首先,我的问题已经被提出,herehere。我的问题不同于其中任何一个,因为我没有通过互联网连接获取数据或关注任何类型的"登录"。为了尽可能简单地说明这一点,我正在制作游戏,我的游戏资源都被加密成专有格式,只需一个密码即可解密数据。我必须在源代码中隐藏该密码。除了将密码保存在应用程序本身之外,我无法想到任何其他方式。在另一个文件中加密密码仍然需要密码,这只是开始隐藏密码的无限循环,等等。

这让我想知道,现代游戏如何处理他们的资源解密密码?想想“使命召唤”,“上古卷轴”,“侠盗猎车手”等游戏。他们加密了他们的数据,对吧?这意味着他们需要密码/ salt / etc来解密它。这样的密码也需要在可执行文件中。 那么他们在哪里隐藏它?它们如何模糊呢?

我考虑过一个选项,看起来它实际上非常好。基本上,我会构建一个方法,它将运行一些数学计算的bizzare gauntlet,构造一个字符串,并返回数据作为密码。有人可以从代码中删除该方法,然后在他们自己的私有应用程序中启动它,但至少它不会如此明显:

public const string ResourceDecryptionPassword = "MY_AWESOME_DECRYPTION_PASSWORD";

另外,我考虑将密码保存为大型硬编码字节数组,我可以在应用程序启动时将其转换回字符串。

任何人都可以为此问题提出任何其他解决方案吗?

另外,我忘了提及:我的游戏的源代码将是obufsicated。这是没有道理的,所以它已经很难在视觉上完成代码。我只需要一个很好的解决方案,如何隐藏加密资源的密码。

1 个答案:

答案 0 :(得分:1)

根据您收到的评论,您已经知道在代码中“隐藏”安全密钥 NOT 是一种很好的做法。它是Security through obscurity,而不是efficient

对于游戏,它很久以前就被使用了。然后随着万维网的发展,游戏需要在线连接来注册/激活游戏 然而,这些游戏如此受欢迎,他们终于破解了(通过虚拟支票取代在线激活)。这就是为什么现代游戏内容的大部分(如果不是全部)现在只有在连接到游戏服务器时才可用。

无论如何,有些游戏保留旧计划的一部分并使用DRM,而其他游戏(Pillars of Eternity)则没有。{/ p>

通用原则是所有DRM都是使密钥的逆向工程(或整个程序的调试)变得困难:易于计算,难以调试。

  • 像一百个左右的嵌入式加密/解密(有数百个密钥)。
  • 另一个例子是DRM software将代码处理成VM。
  • 调用非托管代码来解密数据。
  • 检测任何调试器并将其杀死。
  • 生成解密非托管代码,编译并运行它。

任何足够复杂的东西都可以。

我甚至看到一些财务知名的控制台,当VNC在机器上运行时拒绝启动......其他人抱怨Process Explorer。 但是,这样的隐藏工作很复杂,如果您说代码将被混淆,则应该由混淆软件处理。 顺便说一句,如果你打算玩游戏,你不应该错过 windbg