[此问题与登录凭据或用户/播放器输入任何类型的密码等无关;谢谢你并继续阅读。]
首先,我的问题已经被提出,here和here。我的问题不同于其中任何一个,因为我没有通过互联网连接获取数据或关注任何类型的"登录"。为了尽可能简单地说明这一点,我正在制作游戏,我的游戏资源都被加密成专有格式,只需一个密码即可解密数据。我必须在源代码中隐藏该密码。除了将密码保存在应用程序本身之外,我无法想到任何其他方式。在另一个文件中加密密码仍然需要密码,这只是开始隐藏密码的无限循环,等等。
这让我想知道,现代游戏如何处理他们的资源解密密码?想想“使命召唤”,“上古卷轴”,“侠盗猎车手”等游戏。他们加密了他们的数据,对吧?这意味着他们需要密码/ salt / etc来解密它。这样的密码也需要在可执行文件中。 那么他们在哪里隐藏它?它们如何模糊呢?
我考虑过一个选项,看起来它实际上非常好。基本上,我会构建一个方法,它将运行一些数学计算的bizzare gauntlet,构造一个字符串,并返回数据作为密码。有人可以从代码中删除该方法,然后在他们自己的私有应用程序中启动它,但至少它不会如此明显:
public const string ResourceDecryptionPassword = "MY_AWESOME_DECRYPTION_PASSWORD";
另外,我考虑将密码保存为大型硬编码字节数组,我可以在应用程序启动时将其转换回字符串。
任何人都可以为此问题提出任何其他解决方案吗?
另外,我忘了提及:我的游戏的源代码将是obufsicated。这是没有道理的,所以它已经很难在视觉上完成代码。我只需要一个很好的解决方案,如何隐藏加密资源的密码。
答案 0 :(得分:1)
根据您收到的评论,您已经知道在代码中“隐藏”安全密钥 NOT 是一种很好的做法。它是Security through obscurity,而不是efficient。
对于游戏,它很久以前就被使用了。然后随着万维网的发展,游戏需要在线连接来注册/激活游戏 然而,这些游戏如此受欢迎,他们终于破解了(通过虚拟支票取代在线激活)。这就是为什么现代游戏内容的大部分(如果不是全部)现在只有在连接到游戏服务器时才可用。
无论如何,有些游戏保留旧计划的一部分并使用DRM,而其他游戏(Pillars of Eternity)则没有。{/ p>
通用原则是所有DRM都是使密钥的逆向工程(或整个程序的调试)变得困难:易于计算,难以调试。
任何足够复杂的东西都可以。
我甚至看到一些财务知名的控制台,当VNC在机器上运行时拒绝启动......其他人抱怨Process Explorer。 但是,这样的隐藏工作很复杂,如果您说代码将被混淆,则应该由混淆软件处理。 顺便说一句,如果你打算玩游戏,你不应该错过 windbg 。