如何保护我的保存数据免遭随意黑客攻击?


32

有哪些选项可以安全地保存游戏数据?我对专门为C ++量身定制的解决方案感兴趣。

我正在寻找一种快速且易于使用的东西。我只关心存储诸如

  • 哪些级别已解锁和未解锁

  • 每个级别的用户得分

我再次好奇地知道有什么用处,可以使用的任何好的库都可以为我提供普通玩家不会碰到的漂亮,安全的游戏数据文件。

我刚刚找到这个位置看起来很漂亮,但它会是巨大的,得到潜在的其他库/选项的一些观点在那里。


5
为什么需要安全性?如果玩家因为卡住而想通过编辑保存作弊来解锁关卡,为什么不让他们这么做呢?
亚当

2
好吧,这款游戏有望在IndieCity.com上推出,他们有自己的成就系统可以使用。我只想基于击败包含boss的某些级别的成就。不允许玩家欺骗自己的方式来解锁这些成就。它违反了所谓的“ CAP”规则。所以我需要采取某种形式的安全措施,别无所求,只是为了阻止随便的玩家更改数据
dan369

1
可能需要告诉IndieCity.com这个要求有限制,因为除非保存游戏驻留在您自己的服务器上,否则您无法保护该保存游戏。
Kylotan '02

Answers:


24

首先,假设您有一个非常简单的保存文件,则可以使用文本文件。

最简单的想法之一是使用字符串键来锁定/解锁数据:

void encrypt(string& data,string key)
{
    for(unsigned i=0;i<data.size();i++)
        data[i] += key[i%key.size()];
}

void decrypt(string& data,string key)
{
    for(unsigned i=0;i<data.size();i++)
        data[i] -= key[i%key.size()];
}

但是经过一点Google搜索后,我发现了这些链接,这可能会有用:

编辑:

基于签名的字符是@ v.oddou提到的“未定义行为”,我猜想使用XOR或强制转换为未签名的字符将导致更安全/跨平台的代码。像这样的东西:

void encrypt(string& data,string key)
{
    for(unsigned i=0;i<data.size();i++)
        data[i] ^= key[i%key.size()];
}

void decrypt(string& data,string key)
{
    for(unsigned i=0;i<data.size();i++)
        data[i] ^= key[i%key.size()];
}

这似乎是一个不错的小方法:),足以满足我的目的。我想问一个进一步的问题,关于“密钥”,什么是可接受的密钥?我可以输入长串吗?
dan369

而且您知道,我想这就是我想要的,这正是我想要的。简单易用,没有什么花哨的:)。
dan369

2
@Danran是的,密钥可以接受所有东西,它可以是一个字符字符串,将导致类似Caesar cipher或任何其他长度的短语。您还可以使用其他算法来扰乱数据位置,例如。在偶数和奇数位置交换值。
Ali1S232'2

我建议您使用XOR而不是增加/减少,因为如果您超出要处理的数据类型的范围(char我假设),最终可能会导致数据损坏
bummzack 2012年

2
并不重要,无论您使用异或运算还是增量/减量,数据恢复。请注意,如果递增的属溢出,以后的脱脂剂也会产生下溢。
Ali1S232'2

24

没有什么可以被视为安全的客户端。有人告诉你这是在说谎。

您可以使用所需的任何加密和加扰方法,但是由于客户端还必须能够对其进行解码,并且用户可以访问客户端本身,因此,如果他足够聪明,则可以访问解密密钥/算法。

您只能给愿意破解它的人增加烦恼,但是如果有足够的时间就会被破解,您将无法对此做任何事情。


26
尽管您的说法是正确的,但我认为作者意识到坚定的黑客可能仍然会这么做,因为他明确要求采取一种防止“偶然黑客入侵”的方法。:-\
loneboat 2012年

2
确实,很清楚,黑客只要确定就可以轻松访问我的游戏数据。我只是不希望普通用户/普通用户能够简单地打开文件并开始编辑它们。
dan369

@Danran:很好,我不太喜欢,但我认为在某些情况下这很有意义。我不会删除答案,因为我认为向阅读此书的人指出这一点很重要。
o0'。

2
另外,如果认为值得黑客入侵,则有人可能会这样做,以便临时用户可以进行黑客入侵。有专门针对此的整个论坛。
杰西·多西

@Noctrine:在这种情况下,积极的反应会有所帮助。当游戏中出现一些破解工具时,请密切注意游戏周围的社区,更改加密技术并发布补丁。如果游戏具有在线组件,则可以将此补丁强制性设置。当然,没有玩家(当然不是我)一开始就喜欢被迫更新所有内容,我也不喜欢需要连接。(EA邪恶,嘘声...)
v.oddou

10

您绝对可以使保存文件保持未加密状态,但是可以添加一个通过您要“保护”的所有值计算出的校验和。

因此,饼干将能够重新生成哈希值(您当然会使用适当的盐来使用该哈希值),因此将有一段愉快的时间尝试重新生成。

这仍然不是100%安全,但可能是最佳的时间有效的解决方案。


2

提供了一些简单的XOR加密:

#include <iostream>

using namespace std;

string encryptDecrypt(string toEncrypt) {
    char key[3] = {'K', 'C', 'Q'}; //Any chars will work
    string output = toEncrypt;

    for (int i = 0; i < toEncrypt.size(); i++)
        output[i] = toEncrypt[i] ^ key[i % (sizeof(key) / sizeof(char))];

    return output;
}

以及如何使用它:

int main(int argc, const char * argv[])
{
    string encrypted = encryptDecrypt("kylewbanks.com");
    cout << "Encrypted:" << encrypted << "\n";

    string decrypted = encryptDecrypt(encrypted);
    cout << "Decrypted:" << decrypted << "\n";

    return 0;
}

此代码的输出是这样的:

Encrypted: :=.43*-:8m2$.
Decrypted:kylewbanks.com

0

这里有一些程序(无论如何都是免费的)可以为您提供帮助,它们基本上都将您的所有资源合并为一个exe。

  • NBinder现在是一种商业产品,它是一个旧的但实用的版本。

  • Enigma Virtual Box,另一个具有类似功能的工具。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.