Suy nghĩ đầu tiên của tôi về việc hoàn thành các mức đánh dấu là chỉ ghi thông tin vào một tệp khi hoàn thành cấp độ và tải nó ngay khi ứng dụng được mở lại. Nhưng làm thế nào tôi có thể giữ điều này an toàn khỏi giả mạo và ngăn chặn gian lận?
Suy nghĩ đầu tiên của tôi về việc hoàn thành các mức đánh dấu là chỉ ghi thông tin vào một tệp khi hoàn thành cấp độ và tải nó ngay khi ứng dụng được mở lại. Nhưng làm thế nào tôi có thể giữ điều này an toàn khỏi giả mạo và ngăn chặn gian lận?
Câu trả lời:
Lưu trữ thông tin hoàn thành trong một tệp cục bộ là một phương pháp đơn giản và hoàn toàn chấp nhận được để làm như vậy. Về cơ bản, đây là những gì mọi trò chơi sẽ làm để theo dõi tiến trình (trong một số thời trang, mặc dù các định dạng cụ thể được sử dụng cho dữ liệu và cơ chế lưu trữ sẽ khác nhau).
Bảo vệ tập tin khỏi giả mạo là khó khăn hơn. Nếu không có lý do thuyết phục (người chơi không có lợi thế, không có phần thưởng, et cetera), bạn thường có thể thoát khỏi việc không quan tâm.
Nhưng nếu bạn làm việc chăm sóc, và bạn và nếu bạn hợp lý có thể hy vọng rằng nền tảng của bạn được đóng lại (console và thiết bị không jailbreak iOS-, ví dụ), bạn cũng không cần phải lo lắng quá nhiều. Thông thường, người dùng sẽ không có khả năng truy cập tệp để giả mạo tệp (với điều kiện bạn sử dụng API hệ điều hành phù hợp để lưu trữ dữ liệu ở các vị trí "riêng tư" và công khai (ví dụ: lưu trữ tệp này trong iCloud Drive trên iOS của người dùng có lẽ không phải là một ý tưởng tuyệt vời)
Nếu bạn hoàn toàn lo lắng về việc giả mạo đến mức không được xảy ra (ví dụ: nơi nào có lợi thế để người chơi hoàn thành nhiều cấp độ hơn), bạn cần lưu trữ phía máy chủ dữ liệu. Bất cứ thứ gì được lưu trữ phía khách hàng cuối cùng đều có thể bị xâm phạm và không đáng tin cậy: đó là máy của người dùng, trong tay người dùng. Các điều khiển năng động chỉ là không có lợi cho bạn.
Tất nhiên, không thể hack các tệp được lưu trữ phía máy chủ, nhưng sẽ khó khăn hơn nhiều nếu bạn có một hệ thống kế toán hợp lý.
Preference
lớp học cụ LibGDX
thể có thể giúp tôi ra. Tôi có thể lưu trữ các booleans đơn giản cho các cấp độ và có lẽ với một số điểm cao duy nhất cho nó.
{"finalLevelCompleted":true}
. Làm xong.
Bạn có thể tạo tệp phát lại làm bằng chứng công việc trong khi trình phát đang phát. Bắt đầu trò chơi, lưu các điều kiện bắt đầu bao gồm tên của cấp độ và hạt giống giả, ghi lại trạng thái đầu vào được đánh dấu thời gian chính xác (di chuyển chuột, nhấn phím hoặc nhấn nút, v.v.) mà lớp đầu vào của trò chơi của bạn chuyển sang lớp logic của nó và dừng lại ghi lại một khi mục tiêu đạt được. Bạn có thể nén nhật ký đầu vào bằng mã hóa độ dài chạy (RLE) để chỉ thay đổi trạng thái nút (nhấn, phát hành và tương tự) gây ra các sự kiện nhật ký. Từ các điều kiện ban đầu và nhật ký đầu vào, bạn có thể xác minh hoàn thành mục tiêu bằng cách phát lại các đầu vào vào vật lý và AI của trò chơi.
Các nhật ký như thế này có một số ứng dụng quen thuộc với người chơi trò chơi video, đặc biệt là các trò chơi giả lập. Người chơi có thể tua lại một trò chơi cục bộ từ một bản ghi để tìm kiếm các lỗ hổng chiến lược hoặc để khoe khoang với bạn bè địa phương. Chế độ thu hút trò chơi của bạn có thể bao gồm nhật ký cho các cấp được chọn. Netplay trong các trò chơi sử dụng công cụ GGPO có cấu trúc tương tự nhau, với độ trễ của một vài khung giữa đầu vào và công cụ trò chơi để cho phép thời gian để đầu vào của người chơi khác đến qua Internet. Và bạn có thể yêu cầu những người tham gia bảng xếp hạng tải lên nhật ký, và sau đó máy chủ của bạn sẽ chạy nhanh về phía trước trên một bản sao của trò chơi không có công cụ đồ họa. Để ngăn chặn cuộc tấn công phát lại trong đó một người chơi tải lên nhật ký của người khác, thông tin được sử dụng để tạo hạt giống cho trình tạo số giả danh của trò chơi có thể bao gồm ID người dùng bảng xếp hạng của người chơi. Bằng cách này, máy chủ có thể so sánh chúng,
Một số người chơi cực kỳ tận tâm sẽ tự tạo một bản ghi đầu vào tạo thành bằng chứng công việc. Đây được gọi là "tốc độ hỗ trợ công cụ". Nếu bạn không muốn TAS trên bảng xếp hạng công khai của mình, bạn có thể yêu cầu các lần phát ở các cấp độ cạnh tranh cao nhất phải được thực hiện trong khi kết nối với Internet. Máy chủ sẽ gửi một giá trị khóa cứ sau vài giây và máy khách sẽ gửi nhật ký đầu vào theo thời gian thực như thể nó là trò chơi mạng, được mã hóa bằng khóa đó. Phím này thay đổi cứ sau vài giây và trong các trò chơi sử dụng một số yếu tố ngẫu nhiên, nó có thể tạo ra trình tạo số giả ngẫu nhiên. Nếu độ trễ kéo dài giữa việc gửi khóa và nhận các gói đầu vào tương ứng vượt quá vài giây, chúng ta có thể giả sử rằng người dùng đang thử một cái gì đó "buồn cười".
Nếu bạn muốn thực hiện việc này hoàn toàn ở phía khách hàng và bạn không coi bộ nhớ riêng do nền tảng của bạn cung cấp đủ an toàn (ví dụ: nếu có tiền thực sự liên quan đến việc hoàn thành các cấp), thì điều bạn cần là bằng chứng công việc. Tệp lưu của bạn phải chứa thông tin được thiết kế sao cho việc tạo thông tin khó tính trừ khi bạn đã hoàn thành cấp độ liên quan, nhưng dễ xác minh bởi bên thứ ba không nhất thiết phải hoàn thành cấp cụ thể đó (tốt nhất là không phải tự biết giải pháp). Sự khác biệt về độ khó của việc tính toán bằng chứng công việc trước và sau khi hoàn thành cấp độ càng lớn, bằng chứng công việc càng an toàn.
Tuy nhiên, thật không may, bằng chứng công việc này phải được gắn với lối chơi, vì vậy không có cách chung nào có thể được thực hiện cho các trò chơi tùy ý và thực thi trò chơi của bạn không được chứa giải pháp cho trò chơi theo bất kỳ cách nào, hoặc nếu không thì khá dễ dàng để trích xuất bằng chứng công việc từ thực thi. Trong hầu hết các trường hợp, hầu như bạn sẽ luôn phải thiết kế cụ thể lối chơi của mình xung quanh yêu cầu cụ thể này để làm bằng chứng công việc để chống gian lận, vì vậy bạn cũng sẽ mất đi sự tự do sáng tạo.
Ví dụ, giả sử là một trò chơi Sudoku, bằng chứng công việc có thể là bảng Sudoku đã hoàn thành (lưu ý rằng bảng phải được tạo bởi một bên thứ ba đáng tin cậy, bởi vì hầu hết các thuật toán tạo bảng Sudoku cần phải tính toán trước giải pháp, điều này làm suy yếu bằng chứng về làm việc nếu nó được thực hiện trên máy khách). Hoặc một trò chơi bao gồm một số tổng hợp lớn, bằng chứng về công việc là yếu tố chính (tôi gọi đó là trò chơi RSA vs NSA).
Để thực sự an toàn, trò chơi của bạn phải chứa một số yếu tố ngẫu nhiên, bởi vì nếu trò chơi của bạn hoàn toàn mang tính quyết định, có thể gian lận là sao chép bằng chứng công việc từ người khác đã hoàn thành cấp độ (đây là một cuộc tấn công chơi lại).
Mục tiêu của bằng chứng công việc là làm cho việc gian lận ít nhất cũng khó như tạo bot cho trò chơi. Vì vậy, để gian lận trong trò chơi Sudoku, bạn cần phải có người giải Sudoku, v.v.
Điều này là vô cùng khó khăn. Nếu đó là một trò chơi một người chơi, tốt hơn hết là bạn nên tự do sáng tạo và đừng lo lắng về việc gian lận. Đó là trò chơi của họ, họ đã mua nó và nếu họ gian lận, điều đó không ảnh hưởng đến lợi nhuận của bạn. Hoặc biến nó thành một trò chơi dựa trên máy chủ và thực hiện tất cả logic trò chơi quan trọng của bạn trong máy chủ.
Nếu bạn thích sử dụng tệp bên ngoài để lưu thông tin và đó là nơi người dùng có thể giả mạo, bạn có thể muốn đọc về cách mã hóa hoạt động và sử dụng để ngăn chặn mọi người có thể thực hiện các thay đổi có ý nghĩa đối với tập tin. Một cái gì đó giống như Mật mã Feistel phải là điểm khởi đầu tốt và sẽ đủ để ngăn chặn ai đó mà không mất nhiều thời gian và bí quyết thay đổi tệp lưu. http://en.wikipedia.org/wiki/Feistel_codes
Bên cạnh đó Josh đã đánh vào đầu đinh khi lưu trữ phía máy khách và máy chủ.
Nếu ai đó có thể chọn qua nhị phân và tìm ra thuật toán - bạn sẽ không bao giờ thực sự có thể ngăn chặn điều đó, vì vậy đừng bận tâm.
Để dừng chỉ đơn giản là sử dụng một băm mật mã!
Giả sử bạn có cái này:
function computeHash(levels) {
code = "";
for(level in levels) {
code = hash(code+level+level.isComplete()+"MAGICSALT")
}
}
Nó thực sự đơn giản nhưng điều đó có nghĩa là bạn cần viết mã ở cuối tệp, sau đó bạn phân tích tệp đó như bình thường và làm computeHash(levelListReadFromFile);
NẾU hash = code đọc trong tập tin thì RẤT CÓ VẤN ĐỀ "hợp pháp". Ý tôi là ... ai đó có trình soạn thảo hex sẽ không bẻ khóa nó, nó sẽ đưa ai đó biết nội dung của họ.
Luôn ưu tiên BTW lưu trữ cục bộ - trừ khi đó là MMO rõ ràng, mọi người không muốn bạn sử dụng dữ liệu của họ, đi tàu và làm tất cả mọi thứ. Tôi ghét các chương trình yêu cầu truy cập internet không có lý do chính đáng.