Як я можу захистити свої збережені дані від випадкового злому?


32

Які існують варіанти безпечного збереження даних про ігри? Мене цікавлять рішення, спеціально розроблені для C ++.

Я шукаю те, що швидко і легко використовувати. Мене хвилює лише зберігання такої простої інформації, як

  • Які рівні є, а не розблоковані

  • Оцінка користувача для кожного рівня

Мені знову цікаво дізнатись, що тут використовувати, які хороші бібліотеки використовувати, які дають мені гарні, безпечні файли даних про ігри, з якими середній гравець не може зіпсуватись.

Я щойно знайшов це, що виглядає дуже приємно, але було б чудово отримати деякі думки щодо потенційних інших бібліотек / варіантів.


5
Чому вам потрібна безпека? Якщо гравець хоче обдурити, щоб розблокувати рівень, відредагувавши збереження, тому що він застряг, чому б просто не дати їм це зробити?
Адам

2
добре, гра, сподіваємось, з'явиться на IndieCity.com, у них є власна система досягнень, яку можна використовувати. Я хочу базувати лише кілька досягнень, перемагаючи певні рівні, що містять босів. Дозволити гравцеві обдурити свій шлях до розблокування цих досягнень заборонено. Це проти правил "CAP", як їх називають. Тому мені потрібно встановити певну форму безпеки, нічого фантазійного, крім того, щоб
уникнути

1
Можливо, варто сказати IndieCity.com, що для цієї вимоги є обмеження, оскільки ви не можете захистити гру збереження, якщо гра збереження не залишиться на вашому власному сервері.
Kylotan

Відповіді:


24

спочатку скажемо, оскільки у вас дуже простий файл збереження, ви можете використовувати текстовий файл.

одна з найпростіших ідей - використовувати клавішу string для блокування / розблокування даних:

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 я знайшов ці посилання, які можуть бути корисними:

Редагувати:

Виходячи з того, що підписаний char є "Не визначеною поведінкою", як згадував @ v.oddou, я думаю, що використання XOR або кастинг на неподписаний char призведе до більш безпечного / більше крос-платформного коду. щось на зразок цього:

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 Так, кожна річ є прийнятною для ключа, це може бути один рядок, який призведе до чогось типу шифру Цезаря чи будь-якої іншої фрази будь-якої іншої довжини, яка вам подобається. ви також можете використовувати якийсь інший алгоритм для скремтування позицій даних, наприклад. поміняти значення в парних і непарних позиціях.
Ali1S232

Я пропоную вам використовувати XORзамість збільшення / зменшення, оскільки ви можете виявити пошкоджені дані, якщо ви перевищите межі типу даних, з яким ви маєте справу ( charя припускаю)
bummzack

2
Це насправді не має значення: ви використовуєте xor, або збільшення / зменшення, відновлення даних. зауважте, що якщо збільшуються покоління поколінь, пізніше декремент також генерує підтік.
Ali1S232

24

Ніщо не може вважатися захищеною стороною клієнта; кожен, хто скаже тобі це, бреше.

Ви можете використовувати будь-який потрібний вам метод шифрування та шифрування, але оскільки клієнт також повинен бути в змозі його розшифрувати, і користувач має доступ до самого клієнта, якщо він достатньо винахідливий, він отримає доступ до ключа / алгоритму розшифровки.

Ви можете додати шари роздратування лише тому, хто бажає його зламати, але, маючи достатньо часу, він буде зламаний , і ви нічого не можете з цим зробити.


26
Хоча те, що ви говорите, є правдивим, я думаю, що автор знає, що рішучий хакер, ймовірно, все-таки може потрапити на нього, оскільки він явно попросив спосіб запобігти «випадковому злому». : - \
самотній човен

2
Точно добре розумію, що хакер, якщо це визначить, може легко отримати доступ до моїх даних про ігри. Я просто не хотів, щоб пересічний / випадковий користувач міг просто відкрити файли і почати їх редагувати.
dan369

@Danran: прекрасно, мені це не дуже подобається, але я думаю, що це має сенс у деяких контекстах. Я не видаляю відповіді, тому що думаю, що важливо вказати на це людям, які це читають.
o0 '.

2
Крім того, якщо ви вважаєте, що варто зламати когось, швидше за все, це зробить так, що зламати це можливо випадковим користувачем. Є цілі форуми, присвячені саме цьому.
Джессі Дорсі

@Noctrine: активна реакція може допомогти в цьому випадку. будьте в курсі спільноти навколо вашої гри, коли якийсь інструмент для розтріскування відкритий, змініть техніку шифрування та випустіть виправлення. цей патч може бути обов'язковим, якщо в грі є онлайн-компонент. звичайно, жоден гравець (і, звичайно, не я) не любить, щоб його змушували в першу чергу оновлювати речі, і мені не подобається, щоб вони були підключені. (EA zlo, simcity boo ...)
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

Ось декілька програм (у будь-якому разі безкоштовних), які можуть вам допомогти, вони в основному поєднують усі ваші ресурси в одній програмі.

  • NBinder , зараз комерційний продукт, це стара, але функціональна версія.

  • Enigma Virtual Box , ще один інструмент із подібними функціями.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.