3

是否有解决以下问题的行业标准:

故事; 我有一个程序 (=>game) 将其状态 (=>level,..) 保存在 xml 文件中;此状态不应是用户可编辑的;我想阻止人们编写可以修补我的 xml 和程序状态的修补软件。

您想保护您的 xml 文件。您可以通过加密来做到这一点。但是,您如何处理密钥?

因为有人总是可以逆向工程(打开你的 dll)然后读取密钥......?

public static string Encrypt (string toEncrypt)
{
 byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("12345678901234567890123456789012");
 // 256-AES key
 byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes (toEncrypt);
 RijndaelManaged rDel = new RijndaelManaged ();
 rDel.Key = keyArray;
 rDel.Mode = CipherMode.ECB;
 // http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx
 rDel.Padding = PaddingMode.PKCS7;
 // better lang support
 ICryptoTransform cTransform = rDel.CreateEncryptor ();
 byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
 return Convert.ToBase64String (resultArray, 0, resultArray.Length);
}

public static string Decrypt (string toDecrypt)
{
 byte[] keyArray = UTF8Encoding.UTF8.GetBytes ("12345678901234567890123456789012");
 // AES-256 key
 byte[] toEncryptArray = Convert.FromBase64String (toDecrypt);
 RijndaelManaged rDel = new RijndaelManaged ();
 rDel.Key = keyArray;
 rDel.Mode = CipherMode.ECB;
 // http://msdn.microsoft.com/en-us/library/system.security.cryptography.ciphermode.aspx
 rDel.Padding = PaddingMode.PKCS7;
 // better lang support
 ICryptoTransform cTransform = rDel.CreateDecryptor ();
 byte[] resultArray = cTransform.TransformFinalBlock (toEncryptArray, 0, toEncryptArray.Length);
 return UTF8Encoding.UTF8.GetString (resultArray);
}

编辑:应用程序是 100% 客户端。

4

3 回答 3

10

我有一个程序 (=>game) 将其状态 (=>level,..) 保存在 xml 文件中;此状态不应是用户可编辑的;我想阻止人们编写可以修补我的 xml 和程序状态的修补软件。您可以通过加密来做到这一点。但是,您如何处理密钥?因为有人总是可以逆向工程(打开你的 dll)并读取密钥。

你提出了一个令人信服的论点,即你想做的事情是不可能的。你的论点是正确的。

安全系统旨在保护用户免受攻击者的侵害,而不是保护用户数据免受用户本人的侵害。

这样想:游戏是一个可以编辑状态的程序。用户可以运行游戏。因此用户可以运行一个可以编辑状态的程序。您甚至不需要考虑密钥管理,因为整个场景根本不可能。您不能同时要求用户能够运行更改状态的程序并禁止它

如果您真的希望游戏状态不受用户影响,那么必须给出的是:不允许用户运行游戏。相反,游戏必须在您拥有的服务器上运行,并且用户运行与服务器通信的客户端。然后服务器负责确定客户端是否敌对,并确定游戏状态是什么。

由于游戏现在在您拥有的服务器上运行,并将状态保存到您拥有的服务器上,因此您知道用户不会编辑状态,因为他们无法运行执行此操作的程序

于 2013-06-12T16:58:46.390 回答
4

Yes, you ask the user for a key (password). This is built into the OS with APIs like Data Protection API.

If you're looking for a way to hide a secret from the user then the problem you're trying to solve is called DRM (Digital Rights Management) and you need a DRM solution.

于 2013-06-12T15:18:14.987 回答
-1

创建生成用户特定密钥的用户帐户服务。然后应用程序只需要加密和解密您想用它保护的敏感数据。每次游戏运行时,让用户登录到他的帐户。密钥永远不会存储在用户的机器中,因此您的数据相对安全(至少几乎与您的帐户服务一样安全)。

缺点:您需要连接互联网才能玩游戏,但是,嘿,现在谁没有连接?

这是 100% 安全的吗?不,有足够时间的坚定用户可以合理地解密他保存的游戏。当然,他只能破解他保存的游戏,因此损害很小(只要被破解的数据是用户特定的,而不是共享数据)。

为了让事情变得更难,您总是可以让您的服务在给定用户登录时更改密码。

如果您想要一个 100% 安全的系统,或者敏感数据是共享数据而不是特定于用户的数据(例如 MMORPG),那么,正如 Eric 指出的那样,您唯一的解决方案是将数据放在您的服务器中,而不是在客户端的机器。

于 2013-06-12T17:50:51.263 回答