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.
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