2010-08-30 31 views
5

Tôi đang phát triển một chương trình cần tải và lưu dữ liệu trong các tệp bên ngoài, tôi đã tìm kiếm các tùy chọn và tôi đã chọn lưu dữ liệu vào tệp nhị phân.Tự tham khảo tệp MD5

Vì tôi không muốn ai đó có thể chỉnh sửa tệp dễ dàng, tôi đã nghĩ đến việc viết ở dòng đầu tiên của tệp, tổng md5 của nó. Trong trường hợp này, nếu một số dữ liệu của tệp được thay đổi, tổng sẽ không khớp với một trong các dòng đầu tiên.

Vấn đề tôi thấy sau đó là nếu tôi tính MD5, và sau đó tôi ghi thông tin bên trong tệp, rõ ràng là tổng sẽ khác nhau, vậy làm cách nào để sắp xếp thứ này?

Nếu bạn sugest tôi một lựa chọn tốt hơn số tiền, nó sẽ được chấp nhận như nhau.

Xin cảm ơn trước.

Trả lời

7

Mô hình mối đe dọa của bạn là gì?

Nếu bạn chỉ muốn bảo vệ chống lại việc không thường xuyên, md5 dữ liệu chính của tệp, hãy viết tổng md5 vào cuối. Để xác thực, hãy loại bỏ tổng md5, sau đó chỉ md5 tệp gốc.

Nếu bạn muốn bảo vệ chống lại sự cố nguy hiểm và có kỹ năng, bạn sẽ không may mắn; bất kỳ thuật toán xác thực nào bạn sử dụng có thể được nhân rộng, đặc biệt nếu chúng có quyền truy cập vào chính chương trình đó. Ngay cả một chữ ký mã hóa có thể thất bại nếu kẻ tấn công trích xuất khóa từ chương trình nhị phân.

Nếu đó là một vấn đề lớn, giải pháp Unix là chạy setuid hoặc setgid cho người dùng khác và ghi vào thư mục mà người dùng không thể sửa đổi. Tôi không chắc giải pháp Java nói chung là gì, nhưng điểm vẫn là: người dùng không thể sửa đổi dữ liệu của bạn bởi vì họ bị ngăn không làm như vậy, không phải vì họ bị phát hiện đang cố gắng.

+0

Tôi thích câu trả lời này tốt nhất. +1 – Randolpho

+0

+1 cho "bạn không may mắn chống lại bánh quy" – snemarch

-2

bạn có thể lưu trữ MD5sum trong cơ sở dữ liệu thay vào đó, sau đó khi bạn muốn xem tệp đã được thay đổi hay chưa, hãy kiểm tra tổng MD5 trong db. cách khác bạn có thể lưu trữ md5sum của một tập tin trong tập tin khác.

+0

lý do phiếu giảm giá? hãy giải thích tại sao tùy chọn này sẽ không hoạt động hoặc cách nó không trả lời câu hỏi – JiminyCricket

+1

Điều này không có tác dụng vì ai đó chỉ có thể thay đổi tệp và cập nhật cơ sở dữ liệu bằng thông báo mới. –

3

Mặc dù về mặt lý thuyết có thể tạo một tệp MD5 tự tham chiếu (và tôi nhớ lại một số đã được tìm thấy), đó là một sự lãng phí tài nguyên. Nói chung, cần lưu trữ băm ở đâu đó bên ngoài tệp băm (theo truyền thống có tên là md5sums hoặc sha1sums, tương ứng).

Điều này cho biết, tôi khuyên bạn nên sử dụng SHA-1 ngoài MD5.

+0

+1 - MD5 phải đi ... http://stackoverflow.com/questions/2768248/is-md5-really-that-bad – StuartLC

+1

thậm chí SHA-1 là [bị hỏng] (http://www.schneier.com /blog/archives/2005/02/cryptanalysis_o.html) (fsvo broken) những ngày này. –

+0

@nonnb: tốt, nó chỉ là về OK nếu bạn chỉ cần để ngăn chặn tình cờ tập tin tham nhũng; nhưng vâng, tôi coi nó không được chấp nhận. – Piskvor

1

Bill: Ted, trong khi tôi đồng ý rằng, đúng lúc, ban nhạc của chúng tôi sẽ chiến thắng nhất. Sự thật là, Wyld Stallyns sẽ không bao giờ là một ban nhạc siêu cho đến khi chúng tôi có Eddie Van Halen trên guitar.

Ted: Có, Bill. Nhưng, tôi không tin rằng chúng ta sẽ có được Eddie Van Halen cho đến khi chúng ta có một video chiến thắng.

Bill: Ted, thật vô nghĩa khi có một video chiến thắng trước khi chúng tôi có các nhạc cụ phong nha.

Ted: À, làm cách nào chúng ta có thể có những công cụ phong nha khi chúng ta thậm chí không biết chơi như thế nào?

Bill: Đó là lý do chúng tôi CẦN Eddie Van Halen!

Ted: Và đó là lý do tại sao chúng tôi cần một video chiến thắng.

Bill, Ted: EXCELLENT!

Nghiêm túc, bạn không thể tính tổng MD5 (hoặc một số băm khác) với băm được tính nhúng, vì vậy bạn phải lưu trữ băm ở một nơi khác.

Nếu bạn không muốn mọi người dễ dàng gây rối với tệp, có thể đó là một tùy chọn để làm xáo trộn nó thông qua mã hóa ROT13 hoặc XOR?

+1

Thực ra, bạn * có thể * với MD5, vì nó bị hỏng :) –

0

Chỉ cần bỏ qua dòng đầu tiên khi bạn tính md5. Bạn cũng nên thêm một muối bí mật để đảm bảo không dễ tạo MD5 mới sau khi chỉnh sửa nội dung. Nó phụ thuộc vào nhu cầu thực tế của bạn (mức độ bảo mật).

+0

Muối không phải là bí mật. Mục đích của một muối là để ngăn chặn các bảng được tính toán trước các giá trị băm bằng cách tăng kích thước yêu cầu của các bảng đó. –

+0

nếu có thể chỉnh sửa, ai đó chỉ có thể làm lộn xộn với md5 băm lên trên hoặc họ có thể thêm một số crap khác ở đầu để dòng đầu tiên không còn là md5 băm, làm cho phương pháp đặt nó ở trên cùng hoặc dưới cùng không hữu ích – JiminyCricket

+0

Nếu muối không phải là bí mật, nó khá dễ dàng để tạo lại MD5 băm sau khi tập tin được sửa đổi. Nó chỉ là ít rõ ràng hơn nếu ai đó phải giải mã de bytecode để tìm giá trị muối. Điều này là ổn nếu bạn chỉ muốn ngăn người dùng bình thường chỉnh sửa tệp của bạn. Nếu không, hãy quên nó đi, luôn có cách để bỏ qua việc thực thi phương thức java (trừ khi mã đang chạy trên phía máy chủ). – gawi

1

Điều gì sẽ xảy ra nếu bạn tạo vùng chứa cho dữ liệu của mình? Thông qua một lớp mới với hai thuộc tính, CheckSum và Data, bạn có thể tuần tự hóa tất cả dữ liệu của bạn và đặt nó vào thuộc tính Data. Sau đó, bạn tính toán tổng kiểm tra cho dữ liệu tuần tự hóa và sử dụng thuộc tính CheckSum để lưu trữ tổng kiểm tra.