2011-01-26 32 views
6

Tôi đang viết một trò chơi sẽ có rất nhiều thông tin (cấu hình, một số nội dung, vv) bên trong một số tài liệu xml, cũng như các tệp tài nguyên. Điều này sẽ làm cho nó dễ dàng hơn cho chính tôi và những người khác để chỉnh sửa chương trình mà không cần phải chỉnh sửa các tập tin C++ thực tế, và mà không cần phải biên dịch lại.Phương pháp mã hóa một kho lưu trữ trong C++

Tuy nhiên, khi chương trình bắt đầu phát triển, có sự gia tăng các tệp trong cùng thư mục với chương trình. Vì vậy, tôi nghĩ đến việc đưa chúng vào trong một kho lưu trữ tập tin (vì chúng hầu hết là văn bản, nó rất tuyệt vời với nén).

Câu hỏi của tôi là thế này: Nó sẽ được dễ dàng hơn để nén tất cả các file và:

  1. Thiết lập một mật khẩu để nó (giống như một mật khẩu bảo vệ bưu điện), sau đó cung cấp mật khẩu khi chương trình cần nó
  2. mã hóa các kho lưu trữ với Crypto ++ hoặc tương tự
  3. sửa đổi phần đầu tập tin một chút như một mã hóa "tạm", và sửa tiêu đề của tập tin trong khi các tập tin được nạp

tôi nghĩ số 1 và 2 tương tự, nhưng tôi không thể tìm thấy bất kỳ thông tin nào về việc liệu zlib có thể xử lý lưu trữ được bảo vệ bằng mật khẩu hay không.

Cũng lưu ý rằng tôi không muốn các tệp bên trong tệp nén được "trích xuất" vào thư mục trong khi chương trình đang sử dụng nó. Nó chỉ nên ở trong bộ nhớ của hệ thống.

+0

Tại sao bạn cần mã hóa công cụ này? –

+0

Nó cần phải được mã hóa bởi vì tôi không muốn bất kỳ ai chỉnh sửa hoặc đảo ngược kỹ thuật đó. –

+1

Nếu dữ liệu và mã thực thi nằm trên máy của người dùng thì mã hóa của bạn sẽ không ngăn được một hacker xác định. – Blastfurnace

Trả lời

2

Tôi nghĩ rằng bạn hiểu nhầm khả năng được mã hóa.

Miễn là chương trình được thực hiện trên máy chủ không đáng tin cậy, không thể đảm bảo bất kỳ điều gì.

Ít nhất, bạn có thể gặp khó khăn (mã hóa, mã hóa sự cố), hoặc cực kỳ khó (tự sửa đổi mã, gỡ lỗi/phát hiện móc), để ai đó thiết kế lại mã, nhưng bạn không thể ngăn ngừa nứt. Và với Internet, nó sẽ có sẵn cho tất cả ngay sau khi nó bị nứt bởi một cá nhân.

Điều tương tự cũng xảy ra, để ngăn chặn một cá nhân giả mạo cấu hình. Dù phương pháp (CRC, Hash -> bằng cách mã hóa không có nghĩa là để ngăn chặn giả mạo) nó vẫn có thể đảo ngược kỹ sư nó cho đủ thời gian và phương tiện (và động lực).

Cách duy nhất để đảm bảo cấu hình không được untampered sẽ là lưu trữ nó ở đâu đó BẠN kiểm soát (máy chủ), ký tên (Không đối xứng) và có chương trình kiểm tra chữ ký. Nhưng nó sẽ không, thậm chí sau đó, ngăn chặn một người nào đó đến với một bản vá cho phép chương trình của bạn chạy với một tập tin cấu hình do người dùng cung cấp (không có dấu) ...

Và bạn biết điều tồi tệ nhất? Có lẽ con người sẽ thích phiên bản nứt vì giải thoát khỏi gánh nặng của tất cả những biện pháp "an ninh" nó sẽ chạy nhanh hơn ...

Lưu ý: yes nó là bất hợp pháp, nhưng chúng ta hãy thực dụng ...

Lưu ý: liên quan đến động cơ, bạn càng thông minh hơn với việc bảo vệ chương trình, nó càng hấp dẫn đối với tin tặc -> nó giống như một lời trêu ghẹo não với họ!

Vậy làm thế nào để bạn cung cấp dịch vụ bảo mật?

  • Bạn cần phải tin tưởng vào người thực hiện chương trình
  • Bạn cần phải tin tưởng vào người lưu trữ các cấu hình

Nó chỉ có thể được thực hiện nếu bạn cung cấp một thin client và thực hiện tất cả mọi thứ trên một máy chủ mà bạn tin tưởng ... và thậm chí sau đó bạn sẽ gặp khó khăn khi đảm bảo rằng không ai tìm thấy cửa trong máy chủ của bạn mà bạn không nghĩ đến.

Trong giày của bạn, tôi chỉ đơn giản là đảm bảo phát hiện ánh sáng giả mạo với cấu hình (coi nó là thù địch và đảm bảo xác thực dữ liệu trước khi chạy bất kỳ thứ gì). Sau khi tất cả các tập tin tham nhũng là như nhau có khả năng, và nếu một tập tin cấu hình bị hỏng có nghĩa là một máy bị hủy hoại của khách hàng, sẽ có địa ngục để trả tiền :)

+0

Mặc dù bạn không trả lời câu hỏi của tôi, nó cho tôi rất nhiều suy nghĩ, và bạn chỉ ra những điều mà tôi đã bỏ qua bản thân mình. Nhưng bạn nói đúng. Trong trò chơi của tôi, tôi có một "tệp tùy chọn" được gọi là gỡ lỗi. Nếu có, sẽ có thông tin gỡ lỗi bên trong, ví dụ: tắt dịch vụ vá, cho phép bạn phát mà không cần vá. Hoặc, một ví dụ khác: cho phép trò chơi đọc từ thư mục tệp chứ không phải tệp lưu trữ, nếu lưu trữ không có. Điều này thật tuyệt vời để tạo nội dung nhanh chóng, nhưng tôi không muốn ai đó sử dụng nội dung đó. Vì vậy, tôi sẽ giữ nó phía máy chủ. –

1

Nếu tôi phải chọn trong số ba tùy chọn của mình, tôi sẽ sử dụng Crypto ++, vì nó phù hợp với độc đáo với C++ iostream.

Nhưng: bạn là

  • serializing dữ liệu của bạn để XML
  • nén nó
  • mã hóa nó

tất cả trong bộ nhớ, và ngược lại. Tôi thực sự xem xét lại lựa chọn này. Tại sao không sử dụng ví dụ. SQLite để lưu trữ tất cả dữ liệu của bạn trong cơ sở dữ liệu dựa trên tệp (SQLite không yêu cầu bất kỳ quy trình cơ sở dữ liệu bên ngoài nào)?

Có thể thêm mã hóa thông qua các phần mở rộng khác nhau (SEE hoặc SQLCipher). Nó an toàn, nhanh chóng và hoàn toàn minh bạch.

Bạn không nhận được nén, nhưng sau đó một lần nữa, bằng cách sử dụng SQLite thay vì XML, điều này sẽ không phải là một vấn đề anyway (hoặc vì vậy tôi nghĩ).

+0

Tôi xem xét một cơ sở dữ liệu nhưng vì có nhiều loại tệp khác nhau (không chỉ cấu hình xml), tôi không nghĩ rằng nó có ý nghĩa để lưu trữ tệp .png, ví dụ: vào cơ sở dữ liệu. Ngoài ra, nếu tôi cần chỉnh sửa nhiều hoặc một tệp, tôi có thể: giải nén tệp, chỉnh sửa và đóng gói lại. Một cơ sở dữ liệu, tôi nghĩ, sẽ phức tạp hơn một chút. –

+0

+1 từ tôi, nghe như lời khuyên tốt. –

1

Thiết lập một mật khẩu để nó (giống như một mật khẩu bảo vệ bưu điện), sau đó cung cấp mật khẩu khi chương trình cần nó

Thứ nhất, bạn không thể làm điều này trừ khi bạn đang đi hỏi một người dùng cho mật khẩu. Nếu khóa mã hóa đó được lưu trữ trong mã, không đặt cược vào một kỹ sư đảo ngược được xác định từ việc tìm kiếm nó và giải mã kho lưu trữ.

Quy tắc lớn nhất là: bạn không thể lưu khóa mã hóa trong phần mềm của bạn, bởi vì nếu bạn làm vậy, điểm của việc sử dụng mã hóa là gì? Tôi có thể tìm thấy chìa khóa của bạn.

Bây giờ, vào các điểm khác. zlib does not support encryption và khi họ chỉ ra, PKZip is rather broken anyway. Tôi nghi ngờ nếu bạn có khuynh hướng tìm kiếm, bạn có thể tìm thấy một thư viện nén/nén có khả năng xử lý mã hóa. (ZipArchive Tôi tin rằng xử lý Zip + AES nhưng bạn cần phải trả tiền cho điều đó).

Nhưng tôi là câu trả lời thứ hai của Daniel được hiển thị trên màn hình của tôi. Tại sao? Mã hóa/nén sẽ không cung cấp cho bạn bất kỳ lợi ích nào trừ khi người dùng trình bày một số dạng mã thông báo (mật khẩu, thẻ thông minh, vv) không có trong tệp nhị phân hoặc các tệp liên quan được biên dịch của bạn. Tương tự, nếu bạn không sử dụng hết dung lượng đĩa, tại sao lại nén?

+0

Tôi chưa bao giờ sử dụng SQLite trước đây, vì vậy nếu bạn không đồng ý, vui lòng đề cập đến, nhưng khi tôi đưa ra ý tưởng lưu trữ, đó là vì tôi có thể sắp xếp các tệp tương tự vào lưu trữ của riêng mình (bgm, system, map1, map2) cập nhật đơn giản bởi vì tất cả các chương trình cập nhật phải làm là xóa các tập tin hiện có và thay thế nó bằng một phiên bản mới hơn. Với SQLite, cả tổ chức tổng thể của tất cả các tệp và quá trình cập nhật sẽ hỗn loạn hơn. –

+0

"bạn không thể lưu trữ các khóa mã hóa trong phần mềm của bạn, bởi vì nếu bạn làm vậy, điểm của việc sử dụng mã hóa là gì?". Mã hóa Asymetrical cung cấp bảo vệ chống giả mạo: kho lưu trữ có thể đọc được với các khóa giải mã (công khai), nhưng không thể ghi được. – MSalters

+0

@MSalters đúng, nhưng sau đó dữ liệu cho biết phải duy trì cố định hoặc được cung cấp lại từ nhà cung cấp ban đầu, tức là chủ sở hữu của khóa mã hóa riêng. Bạn không thể ngăn người dùng đọc lưu trữ đó, mà tôi * nghĩ * (OP cho tôi biết nếu tôi sai, tôi luôn có thể xóa thông tin này) OP có nghĩa là. –

Các vấn đề liên quan