【问题标题】:Handling Resource Decryption Passwords处理资源解密密码
【发布时间】:2015-12-23 17:09:42
【问题描述】:

[此问题与登录凭据或用户/玩家输入任何类型的密码短语等无关;谢谢你,继续阅读。]

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

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

我考虑了一个选项,看起来它实际上会很不错。基本上,我会构造一个方法,该方法将通过一些奇怪的数学计算,构造一个字符串,并返回数据作为密码。有人可以直接从代码中提取该方法,然后在他们自己的私有应用程序中启动它,但至少它不会如此明目张胆:

public const string ResourceDecryptionPassword = "MY_AWESOME_DECRYPTION_PASSWORD";

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

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

另外,我忘了提一下:我的游戏源代码将被混淆。这很简单,因此它已经使直观地浏览代码变得困难。我只需要如何为我的加密资源隐藏密码的一个很好的解决方案。

【问题讨论】:

  • 你认为游戏为什么会加密他们的资产?你说“数据”,但是什么样的数据呢?图片?保存文件?在应用程序中嵌入密钥永远无法得到合理的保护。我可以只使用 WinDbg 并在您调用 Decrypt 或任何您调用的名称上放置一个断点,然后查看传入的密钥。您不需要源代码来调试应用程序。
  • @vcsjones Data = 图像、模型、着色器、资源、默认游戏数据。
  • 所以你想分发具有唯一登录密码/密钥的离线游戏来解锁它?用户解锁游戏后是否可以更改此密码?或者这是在单个设备上一次性解锁?您可以只使用许可证管理器。或者您希望为每个发布的游戏使用相同的密码?
  • @Oceans 不,这不是我想要的。我希望我的资源被加密(已经实现)。我希望游戏能够解密我的资产。我的意图与登录凭据无关。我了解在可执行文件中完美隐藏密码是不可能的;我只是想知道我在可执行文件中存储密码的选择是什么(因此需要一些时间来发现,几周,几个月,甚至几年)
  • @Krythic,您想要一个在正确输入时可以访问您的程序的密钥/密码,即使与多人共享程序时所有人都将获得相同的密钥?我只是在仔细检查,因为将密钥存储在程序本身中并不安全。不管你加密多少,最终它总是有可能破解的。您可以使用时间作为参数使其动态化变得更加困难,但是如果您使用单个密码,那么人们也可以与他人共享此密码,而无需破解任何东西。所以我肯定会考虑让它依赖于用户

标签: c# security passwords


【解决方案1】:

根据您收到的 cmets,您已经知道在代码中“隐藏”安全密钥不是一个好习惯。是Security through obscurity,不是efficient

对于游戏来说,它是很久以前使用的。然后随着万维网的发展,游戏需要在线连接来注册/激活游戏。
然而,这些游戏非常受欢迎,最终以任何方式破解(通过虚拟检查替换在线激活)。这就是为什么大部分现代游戏内容(如果不是全部)现在只有在连接到游戏服务器时才可用。

无论如何,有些游戏保留了旧方案的一部分并使用DRM,而其他游戏 (Pillars of Eternity) 则没有。

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

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

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

我什至见过一些金融知名的控制台在机器上运行 VNC 时拒绝启动...其他人抱怨 Process Explorer。
但是,这样的隐藏工作很复杂,如果您说代码会被混淆,那么它应该已经被混淆软件处理了。
顺便说一句,如果您打算玩游戏,您不应该错过 windbg

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 2022-01-21
    • 2011-10-03
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-08
    • 1970-01-01
    • 2011-07-27
    相关资源
    最近更新 更多