ฉันจะปกป้องข้อมูลบันทึกของฉันจากการแฮ็คแบบปกติได้อย่างไร


32

มีตัวเลือกอะไรบ้างในการบันทึกข้อมูลเกมอย่างปลอดภัย? ฉันสนใจโซลูชั่นที่ออกแบบมาเฉพาะสำหรับ C ++

ฉันกำลังมองหาบางสิ่งที่รวดเร็วและใช้งานง่าย ฉันกังวลเพียงเกี่ยวกับการจัดเก็บข้อมูลอย่างง่ายเช่น

  • ระดับใดบ้างและไม่ถูกปลดล็อค

  • คะแนนของผู้ใช้สำหรับแต่ละระดับ

ฉันอยากรู้อีกครั้งว่ามีอะไรให้ใช้บ้างห้องสมุดที่ดีที่จะใช้ซึ่งให้ไฟล์ข้อมูลเกมที่ปลอดภัยและเชื่อถือได้ซึ่งผู้เล่นทั่วไปไม่สามารถทำได้

ฉันเพิ่งพบสิ่งนี้ที่นี่ซึ่งดูดีมาก แต่มันจะดีมากหากได้รับความคิดเห็นเกี่ยวกับห้องสมุด / ตัวเลือกอื่น ๆ


5
ทำไมคุณถึงต้องการความปลอดภัย? หากผู้เล่นต้องการที่จะโกงเพื่อปลดล็อกระดับโดยการแก้ไขบันทึกเพราะพวกเขาติดอยู่ทำไมไม่ปล่อยให้พวกเขาทำมันได้หรือไม่
อดัม

2
เกมหวังว่าจะขึ้นไปบน IndieCity.com พวกเขามีระบบความสำเร็จของตัวเองที่จะใช้ ฉันต้องการที่จะยึดความสำเร็จเพียงเล็กน้อยจากการเอาชนะระดับที่มีเจ้านาย เพื่อให้ผู้เล่นสามารถโกงวิธีการปลดล็อคความสำเร็จเหล่านี้ไม่ได้รับอนุญาต มันขัดกับกฎ "CAP" ตามที่พวกเขาถูกเรียก ดังนั้นฉันจำเป็นต้องมีรูปแบบของมาตรการรักษาความปลอดภัยในสถานที่ไม่มีอะไรแฟนซี แต่เพียงเพื่อหยุดผู้เล่นชั่วคราวจากการเปลี่ยนแปลงข้อมูล
dan369

1
อาจเป็นสิ่งที่ควรค่าแก่การบอก IndieCity.com ว่ามีข้อ จำกัด เกี่ยวกับข้อกำหนดดังกล่าวเนื่องจากเป็นไปไม่ได้ที่คุณจะปลอดภัยเกมบันทึกเว้นแต่ว่าเกมบันทึกจะอยู่บนเซิร์ฟเวอร์ของคุณเอง
Kylotan

คำตอบ:


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 เล็กน้อยฉันพบลิงค์เหล่านี้ซึ่งอาจมีประโยชน์:

แก้ไข:

ตาม 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 หรือการเพิ่ม / ลดลงการกู้คืนข้อมูล โปรดทราบว่าหากการเพิ่มหน่วยความจำล้นเกิดขึ้น decreament ในภายหลังจะสร้างอันเดอร์โฟล์
Ali1S232

24

ไม่มีสิ่งใดที่จะถือว่าเป็นฝั่งไคลเอ็นต์ที่ปลอดภัย ใครก็ตามที่บอกคุณว่ากำลังโกหก

คุณสามารถใช้วิธีการเข้ารหัสและการแย่งชิงใด ๆ ที่คุณต้องการ แต่เนื่องจากลูกค้าจะต้องสามารถถอดรหัสได้และผู้ใช้สามารถเข้าถึงตัวลูกค้าเองได้หากเขามีความสามารถพอที่จะเข้าถึงคีย์ถอดรหัส / อัลกอริทึม

คุณสามารถเพิ่มเลเยอร์ของความรำคาญให้กับใครบางคนที่เต็มใจที่จะถอดรหัส แต่ให้เวลาพอที่มันจะถูกแคร็กและคุณไม่สามารถทำอะไรกับมันได้


26
ในขณะที่สิ่งที่คุณพูดนั้นเป็นความจริงฉันคิดว่าผู้เขียนทราบว่าแฮกเกอร์ที่มุ่งมั่นอาจยังสามารถเข้าถึงได้เนื่องจากเขาขอวิธีการอย่างชัดเจนเพื่อป้องกัน : - \
loneboat

2
โปรดทราบว่าแฮ็กเกอร์หากที่กำหนดนั้นสามารถเข้าถึงข้อมูลเกมของฉันได้อย่างง่ายดาย ฉันไม่ต้องการให้ผู้ใช้ทั่วไป / ธรรมดาสามารถเปิดไฟล์และเริ่มแก้ไขได้อย่างง่ายดาย
dan369

@ ด่าน: ดีฉันไม่ชอบมาก แต่ฉันคิดว่ามันสมเหตุสมผลในบางบริบท ฉันไม่ได้ลบคำตอบเพราะฉันคิดว่ามันเป็นสิ่งสำคัญที่จะชี้ให้ผู้คนที่อ่านสิ่งนี้เข้าใจ
o0 '

2
นอกจากนี้หากถือว่ามีค่าการแฮ็กอาจทำให้ใครบางคนทำการแฮ็คโดยผู้ใช้ทั่วไป มีฟอรัมทั้งหมดที่ทุ่มเทให้กับเรื่องนั้น
Jesse Dorsey

@Noctrine: ปฏิกิริยาที่ใช้งานสามารถช่วยได้ในกรณีนี้ ระวังชุมชนรอบ ๆ เกมของคุณเมื่อเครื่องมือถอดรหัสบางตัวเปิดอยู่ให้เปลี่ยนเทคนิคการเข้ารหัสและปล่อยแพทช์ แพทช์นี้สามารถบังคับได้ถ้าเกมนั้นมีองค์ประกอบออนไลน์ แน่นอนว่าไม่มีผู้เล่น (และแน่นอนว่าไม่ใช่ฉัน) ชอบถูกบังคับให้อัปเดตทุกอย่างตั้งแต่แรกและฉันไม่ต้องการเชื่อมต่อ (EA evil, simcity boo ... )
v.oddou

10

คุณสามารถปล่อยให้ไฟล์บันทึกของคุณไม่เข้ารหัสอย่างแน่นอน แต่เพิ่มการตรวจสอบที่คำนวณจากค่าทั้งหมดที่คุณต้องการ "ป้องกัน"

แครกเกอร์จะสามารถผลิต hashing อีกครั้ง (ซึ่งแน่นอนว่าคุณจะใช้กับเกลือที่เหมาะสม) และจะมีช่วงเวลาที่มีความสุขที่จะลองผลิตอีกครั้ง

สิ่งนี้จะยังไม่ปลอดภัย 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เป็นอีกเครื่องมือหนึ่งที่มีคุณสมบัติคล้ายกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.