Làm cách nào tôi có thể bảo vệ dữ liệu lưu của mình khỏi hack thông thường?


32

Có những lựa chọn nào để lưu dữ liệu trò chơi một cách an toàn? Tôi quan tâm đến các giải pháp được thiết kế riêng cho C ++.

Tôi đang tìm kiếm một cái gì đó nhanh chóng và dễ sử dụng. Tôi chỉ quan tâm đến việc lưu trữ thông tin đơn giản như

  • Những cấp độ nào và không được mở khóa

  • Điểm số của người dùng cho mỗi cấp độ

Tôi lại tò mò muốn biết những gì ngoài kia sẽ sử dụng, bất kỳ thư viện tốt nào để sử dụng cung cấp cho tôi các tệp dữ liệu trò chơi an toàn, đẹp mà người chơi trung bình không thể làm hỏng.

Tôi chỉ tìm thấy cái này ở đây trông rất đẹp, nhưng thật tuyệt khi có một số ý kiến ​​về các thư viện / tùy chọn tiềm năng khác ngoài kia.


5
Tại sao bạn yêu cầu bảo mật? Nếu người chơi muốn gian lận để mở khóa một cấp bằng cách chỉnh sửa lưu vì họ bị kẹt tại sao không để họ làm điều đó?
Adam

2
tốt, trò chơi hy vọng sẽ đi lên trên IndieCity.com, họ có hệ thống thành tích riêng để sử dụng. Tôi muốn chỉ dựa vào một vài thành tích để đánh bại các cấp nhất định có chứa trùm. Để người chơi có thể gian lận để mở khóa những thành tích này là không được phép. Nó chống lại các quy tắc "CAP" khi chúng được gọi. Vì vậy, tôi cần phải có một số hình thức bảo mật tại chỗ, không có gì lạ mắt mà chỉ để ngăn người chơi bình thường thay đổi dữ liệu
dan369

1
Có thể đáng nói với IndieCity.com rằng có những giới hạn đối với yêu cầu đó, vì bạn không thể bảo mật trò chơi lưu trừ khi trò chơi lưu vẫn ở trên máy chủ của bạn.
Kylotan

Câu trả lời:


24

đầu tiên hãy nói vì bạn có một tệp lưu rất đơn giản, bạn có thể sử dụng tệp văn bản.

một trong những ý tưởng đơn giản nhất là sử dụng khóa chuỗi để khóa / mở khóa dữ liệu:

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()];
}

nhưng sau khi tìm kiếm trên google, tôi đã tìm thấy các liên kết này, có thể hữu ích:

Chỉnh sửa:

Dựa trên char đã ký là "Hành vi không xác định" như @ v.oddou đã đề cập, tôi đoán sử dụng XOR hoặc truyền sang char không dấu sẽ dẫn đến mã an toàn / đa nền tảng hơn. đại loại như thế này:

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()];
}

Đây có vẻ là một phương pháp nhỏ tốt đẹp :), vừa đủ cho mục đích của tôi. Tôi tò mò muốn hỏi thêm một câu hỏi ở đây, về mặt "chìa khóa", khóa nào là chấp nhận được? Tôi có thể vượt qua trong bất cứ điều gì tức là một chuỗi dài?
dan369

Và bạn biết đấy, tôi nghĩ tôi sẽ đi với nó, nó chính xác là những gì tôi muốn. Đơn giản và dễ sử dụng, và không có gì quá lạ mắt :).
dan369

2
@Danran yeah mọi thứ đều được chấp nhận cho khóa, nó có thể là một chuỗi char sẽ dẫn đến một cái gì đó như mật mã Caesar hoặc bất kỳ cụm từ nào khác với bất kỳ độ dài nào bạn muốn. bạn cũng có thể sử dụng một số thuật toán khác để xáo trộn các vị trí dữ liệu, vd. trao đổi giá trị ở vị trí chẵn và lẻ.
Ali1S 232

Tôi khuyên bạn nên sử dụng XORthay vì tăng / giảm, vì bạn có thể kết thúc với dữ liệu bị hỏng nếu vượt quá giới hạn của loại dữ liệu bạn đang xử lý ( chartôi giả sử)
bummzack

2
Nó không thực sự quan trọng, hoặc bạn sử dụng xor, hoặc tăng / giảm, phục hồi dữ liệu. lưu ý rằng nếu tăng tổng số tiền thừa, việc giải quyết sau này cũng sẽ tạo ra tràn.
Ali1S 232

24

Không có gì có thể được coi là phía khách hàng an toàn; bất cứ ai nói với bạn rằng nó đang nói dối

Bạn có thể sử dụng bất kỳ phương pháp mã hóa và xáo trộn nào bạn muốn, nhưng vì máy khách cũng phải có khả năng giải mã nó và người dùng có quyền truy cập vào chính máy khách, nếu anh ta đủ tài nguyên, anh ta sẽ có quyền truy cập vào khóa / thuật toán giải mã.

Bạn chỉ có thể thêm các lớp phiền toái cho ai đó sẵn sàng bẻ khóa nó, nhưng cho đủ thời gian sẽ bị bẻ khóa , và bạn không thể làm gì về điều đó.


26
Trong khi những gì bạn nói là đúng, tôi nghĩ rằng tác giả biết rằng một hacker quyết tâm có thể vẫn có thể hiểu được, vì anh ta rõ ràng yêu cầu một cách để ngăn chặn "hack thông thường". : - \
loneboat

2
Chính xác, nhận thức rõ rằng một hacker nếu xác định được điều đó có thể dễ dàng truy cập dữ liệu trò chơi của tôi. Tôi chỉ không muốn người dùng trung bình / bình thường có thể chỉ đơn giản mở các tệp và bắt đầu chỉnh sửa chúng.
dan369

@Danran: tốt thôi, tôi không thích điều đó lắm nhưng tôi đoán nó có ý nghĩa trong một số bối cảnh. Tôi không xóa câu trả lời vì tôi nghĩ điều quan trọng là chỉ ra điều này cho những người đọc nó.
o0 '.

2
Ngoài ra, nếu nó được coi là đáng hack thì ai đó sẽ có khả năng thực hiện để người dùng thông thường có thể hack nó. Có toàn bộ diễn đàn dành riêng cho điều đó.
Jesse Dorsey

@Noctrine: một phản ứng tích cực có thể giúp đỡ trong trường hợp này. hãy chú ý đến cộng đồng xung quanh trò chơi của bạn, khi một số công cụ bẻ khóa được mở, hãy thay đổi kỹ thuật mã hóa và phát hành một bản vá. Bản vá này có thể được thực hiện bắt buộc nếu trò chơi có một thành phần trực tuyến. tất nhiên không có người chơi nào (và chắc chắn không phải tôi) thích bị buộc phải cập nhật mọi thứ ngay từ đầu, tôi cũng không cần phải kết nối. (EA ác, simcity boo ...)
v.oddou

10

Bạn chắc chắn có thể để tập tin lưu của mình không được mã hóa nhưng thêm một tổng kiểm tra được tính toán thông qua tất cả các giá trị mà bạn muốn "bảo vệ".

Do đó, cracker sẽ có thể tái sản xuất băm (mà bạn không sử dụng với muối thích hợp) và do đó sẽ có một thời gian hạnh phúc khi cố gắng sản xuất lại.

Điều này sẽ vẫn không an toàn% 100, nhưng, có lẽ là giải pháp hiệu quả nhất về thời gian.


2

Điều này cung cấp một số mã hóa XOR đơn giản:

#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;
}

Và làm thế nào để sử dụng nó:

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;
}

Đầu ra của mã này là:

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

0

Dưới đây là một vài chương trình (dù là miễn phí) có thể giúp bạn, cả hai về cơ bản kết hợp tất cả các tài nguyên của bạn vào một exe.

  • NBinder , hiện là một sản phẩm thương mại, đây là phiên bản cũ nhưng đầy đủ chức năng.

  • Enigma Virtual Box , một công cụ khác có tính năng tương tự.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.