2008-08-29 40 views
8

Tôi muốn ràng buộc tệp cấu hình vào tệp thực thi của mình. Tôi muốn làm điều này bằng cách lưu trữ một băm MD5 của tập tin bên trong thực thi. Điều này sẽ giữ cho bất kỳ ai nhưng thực thi từ việc sửa đổi tệp.Làm cách nào để lưu trữ thông tin trong tệp thực thi của tôi trong .Net

Về cơ bản nếu ai đó sửa đổi tệp này bên ngoài chương trình, chương trình sẽ không tải lại được.

EDIT: Chương trình xử lý thông tin thẻ tín dụng để có thể thay đổi cấu hình theo bất kỳ cách nào có thể là một nguy cơ bảo mật tiềm ẩn. Phần mềm này sẽ được phân phối cho một số lượng lớn khách hàng. Lý tưởng nhất là khách hàng nên có một cấu hình được gắn trực tiếp vào thực thi. Điều này hy vọng sẽ giữ cho một hacker không thể có được một cấu hình giả mạo tại chỗ.

Cấu hình vẫn cần phải chỉnh sửa được mặc dù việc biên dịch từng bản sao cho từng khách hàng không phải là một tùy chọn.


Điều quan trọng là điều này là động. Vì vậy, tôi có thể gắn băm vào tập tin cấu hình khi thay đổi cấu hình.

Trả lời

11

Một giải pháp tốt hơn là để lưu trữ các MD5 trong tệp cấu hình. Nhưng thay vì MD5 chỉ là tệp cấu hình, cũng bao gồm một số giá trị "khóa" bí mật, như một guid cố định, trong MD5.

write(MD5(SecretKey + ConfigFileText)); 

Sau đó, bạn chỉ cần xóa MD5 đó và khôi phục tệp (bao gồm khóa bí mật). Nếu MD5 giống nhau, thì không ai sửa đổi nó. Điều này ngăn cản ai đó sửa đổi và áp dụng lại MD5 vì họ không biết khóa bí mật của bạn.

Hãy nhớ đây là giải pháp khá yếu (như bạn đang đề xuất) vì chúng có thể dễ dàng theo dõi chương trình của bạn để tìm khóa hoặc nơi lưu trữ MD5.

Giải pháp tốt hơn là sử dụng hệ thống khóa công cộng và ký tên tệp cấu hình. Một lần nữa là yếu kể từ đó sẽ yêu cầu khóa riêng được lưu trữ trên máy địa phương của họ. Khá nhiều thứ được chứa trên máy tính cục bộ của họ có thể được bỏ qua với đủ công sức.

Nếu bạn thực sự muốn lưu trữ thông tin trong tệp thực thi của mình (điều mà tôi sẽ không khuyến khích) thì bạn chỉ có thể thử thêm nó vào cuối EXE. Điều đó thường an toàn. Sửa đổi các chương trình thực thi là vi-rút như hành vi và hầu hết hệ điều hành bảo mật cũng sẽ cố gắng ngăn bạn. Nếu chương trình của bạn nằm trong thư mục Program Files, và tập tin cấu hình của bạn nằm trong thư mục Application Data, và người dùng đăng nhập với tư cách người không phải quản trị viên (trong XP hoặc Vista), thì bạn sẽ không thể cập nhật EXE.

Cập nhật: Tôi không quan tâm nếu bạn đang sử dụng mã hóa không đối xứng, RSA hoặc Quantum mật mã, nếu bạn đang lưu trữ các phím trên máy tính của người sử dụng (mà bạn phải làm trừ khi bạn con đường đó tất cả thông qua một trang web dịch vụ) sau đó người dùng có thể tìm thấy khóa của bạn, ngay cả khi nó có nghĩa là kiểm tra sổ đăng ký trên CPU vào thời gian chạy! Bạn chỉ mua cho mình một mức độ bảo mật vừa phải, vì vậy hãy gắn bó với một thứ đơn giản. Để ngăn chặn sửa đổi các giải pháp tôi đề nghị là tốt nhất. Để ngăn chặn việc đọc sau đó mã hóa nó, và nếu bạn đang lưu trữ khóa của bạn tại địa phương thì hãy sử dụng AES Rijndael.

Cập nhật: Khoá FixedGUID/SecretKey có thể được tạo ra tại thời điểm cài đặt và được lưu trữ ở đâu đó "bí mật" trong sổ đăng ký. Hoặc bạn có thể tạo ra nó mỗi khi bạn sử dụng nó từ cấu hình phần cứng. Sau đó, bạn đang nhận được phức tạp hơn. Cách bạn muốn thực hiện điều này để cho phép mức thay đổi phần cứng vừa phải sẽ có 6 chữ ký khác nhau và băm tệp cấu hình của bạn 6 lần - một lần với mỗi lần. Kết hợp mỗi một với một giá trị bí mật thứ 2, giống như GUID đã đề cập ở trên (hoặc toàn cầu hoặc được tạo lúc cài đặt). Sau đó, khi bạn kiểm tra, bạn xác minh từng mã băm riêng biệt. Miễn là họ có 3 trong số 6 (hoặc bất kỳ sự khoan dung của bạn là gì) thì bạn chấp nhận nó. Lần sau khi bạn viết nó, bạn băm nó với cấu hình phần cứng mới. Điều này cho phép họ từ từ trao đổi phần cứng theo thời gian và có được một hệ thống hoàn toàn mới. . . Có lẽ đó là một điểm yếu. Tất cả đều thuộc về sự khoan dung của bạn. Có các biến thể dựa trên dung sai chặt chẽ hơn.

CẬP NHẬT: Đối với hệ thống thẻ tín dụng, bạn có thể muốn xem xét một số bảo mật thực. Bạn nên giữ lại các dịch vụ của nhà tư vấn an ninh và mã hóa . Cần phải trao đổi thêm thông tin. Họ cần phân tích các nhu cầu và rủi ro cụ thể của bạn.

Ngoài ra, nếu bạn muốn bảo mật bằng .NET, trước hết bạn cần phải bắt đầu với trình biên dịch .NET thực sự tốt (just Google it). Một hội đồng .NET là cách dễ dàng để tháo rời và lấy mã nguồn và đọc tất cả các bí mật của bạn. Không phải là âm thanh như một bản ghi bị hỏng, nhưng bất cứ điều gì phụ thuộc vào sự an toàn của hệ thống người dùng của bạn về cơ bản là thiếu sót từ đầu.

+0

Chỉ trên một ghi chú nhỏ, ngay cả khi được viết bằng C++, nếu bạn gửi/lưu trữ bí mật, bạn đang mạo hiểm nó bị đánh cắp (Đây là phần quan trọng ở đây). Cách chắc chắn duy nhất để đạt được an ninh thích hợp ở đây là không bao giờ gửi bí mật. Có khả năng bạn sẽ cần một số loại mã hóa hai phần theo đó người dùng và các khóa riêng của bạn được sử dụng. Như Jim đã nói, bạn cần một nhà phân tích bảo mật thích hợp và lời khuyên chuyên nghiệp ở đây. – Gregory

-2

chỉ làm cho một const string chứa hash md5 và biên dịch nó vào ứng dụng của bạn ... ứng dụng của bạn có thể sau đó chỉ cần tham khảo const string này khi xác nhận các tập tin cấu hình

1

Ngoài sự tò mò tinh khiết, lý do của bạn cho việc không bao giờ muốn tải tệp nếu nó bị thay đổi là gì?

Tại sao không chỉ giữ tất cả thông tin cấu hình được biên dịch trong tệp thực thi? Tại sao bận tâm với một tập tin bên ngoài ở tất cả?

Sửa

Tôi chỉ đọc chỉnh sửa của bạn về vấn đề này là một chương trình thông tin thẻ tín dụng. Điều đó đặt ra một thách thức rất thú vị. Tôi sẽ nghĩ rằng, với mức độ bảo mật đó, một số loại mã hóa khá lớn là cần thiết nhưng tôi không biết gì về việc xử lý những thứ như vậy theo cách mà các bí mật mật mã không thể được trích xuất từ tệp thực thi.

Xác thực dựa vào một số loại nguồn trực tuyến có khả năng không?

1

Tôi khuyên bạn nên sử dụng Mã hóa khóa không đối xứng để mã hóa tệp cấu hình của bạn, bất cứ nơi nào chúng được lưu trữ, bên trong tệp thực thi hay không.

Nếu tôi nhớ chính xác, RSA là một trong các biến thể.

Đối với lời giải thích của nó, xem Public-key cryptography trên Wikipedia

Store "đọc" quan trọng trong việc thực thi của bạn và giữ cho mình những "văn bản" chìa khóa. Vì vậy, không có ai nhưng bạn có thể sửa đổi cấu hình.

này có những ưu điểm của:

  • Không ai có thể thay đổi cấu hình, trừ khi họ có "văn bản" chính vì bất kỳ sửa đổi sẽ tham nhũng nó hoàn toàn, ngay cả khi họ biết "đọc" chìa khóa nó sẽ mất độ tuổi để tính toán chìa khóa khác.
  • Đảm bảo sửa đổi.
  • Không khó - có rất nhiều thư viện có sẵn trong những ngày này. Ngoài ra còn có rất nhiều chương trình tạo khóa có thể tạo ra các khóa thực sự, dài thực sự.

Thực hiện một số nghiên cứu về cách triển khai đúng cách.

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