Bảo vệ mã nguồn Java khỏi bị truy cập [đã đóng]


96

Tuần trước, tôi phải tạo một GUI nhỏ cho bài tập về nhà. Không ai trong số bạn học của tôi đã làm điều đó. Họ đã đánh cắp một cái của tôi từ nơi chúng tôi phải tải nó lên và sau đó chúng lại tải nó lên như của chúng. Khi tôi nói với giáo viên rằng tất cả chỉ là công việc của tôi thì ông ấy không tin tôi.

Vì vậy, tôi nghĩ đến việc đưa một phương pháp vô dụng hoặc một cái gì đó vào bên trong với một bằng chứng rằng tôi đã mã hóa nó. Tôi đã nghĩ đến mã hóa. Ý tưởng tốt nhất của tôi cho đến bây giờ:

String key = ("ZGV2ZWxvcGVkIGJ5IFdhckdvZE5U"); //My proof in base64

Bạn có thể nghĩ ra một số cách khác tốt hơn không?


31
Các tệp không có dấu thời gian trong trang web tải lên?
Averroes

76
Bạn nói rằng họ có thể tải xuống mã của bạn từ nơi bạn đã tải nó lên? Điều đó có vẻ điên rồ. Bạn nên đặt câu hỏi về phương pháp của giáo viên. Tốt hơn là nói chuyện với sếp của anh ấy / cô ấy vì anh ấy / cô ấy có vẻ hơi vô lý.
keyer

56
Epic làm hỏng một trong những bài tập ở nhà của bạn và để cả lớp thất bại.
giữ vào

25
Có vẻ như giáo viên cũng là người mới bắt đầu ...
UmNyobe

22
Điều hợp lý duy nhất cần làm trong tình huống này là cố gắng khắc phục vấn đề bằng cách nói chuyện với giáo viên về cách bạn tải bài tập về nhà lên. Tải nó lên một khu vực mà bạn có thể tải xuống các bài nộp của người khác hoàn toàn là ngu ngốc - Tôi không chắc một giáo viên nghĩ rằng cách tiếp cận đó là một cách tốt thực sự nên dạy!
Michael Berry

Câu trả lời:


104

Tôi đã có cùng một vấn đề như bạn một thời gian dài trước đây. Chúng tôi đã có máy Windows 2000 và tải tệp lên một thư mục mạng Novel mà mọi người đều có thể xem. Tôi đã sử dụng một số thủ thuật để đánh bại ngay cả những tên trộm giỏi nhất: đánh dấu khoảng trắng; đánh dấu siêu dữ liệu; nhân vật bất thường; dấu thời gian đáng tin cậy; modus operandi. Đây là chúng theo thứ tự.

Watermarking khoảng trắng:

Đây là đóng góp ban đầu của tôi cho việc đánh dấu nước. Tôi cần một hình mờ ẩn hoạt động trong các tệp văn bản. Mẹo mà tôi nghĩ ra là đặt vào một mẫu khoảng trắng cụ thể giữa các câu lệnh (hoặc đoạn văn) lập trình. Tệp trông giống nhau với chúng: một số câu lệnh lập trình và ngắt dòng. Chọn văn bản một cách cẩn thận sẽ hiển thị khoảng trắng. Mỗi dòng trống sẽ chứa một số khoảng trắng nhất định rõ ràng không phải ngẫu nhiên hay tình cờ. (ví dụ: 17) Trong thực tế, phương pháp này đã làm việc cho tôi vì họ không thể tìm ra những gì tôi đang nhúng vào tài liệu.

Đánh dấu siêu dữ liệu

Đây là nơi bạn thay đổi siêu dữ liệu của tệp để chứa thông tin. Bạn có thể nhúng tên, mã băm, v.v. của mình vào các phần không nhìn thấy của tệp, đặc biệt là của EXE. Trong những ngày ở NT, Luồng dữ liệu thay thế rất phổ biến.

Nhân vật bất thường

Tôi sẽ ném cái này vào chỉ để đá. Một thủ thuật mạo danh IRC cũ là đặt tên bằng các chữ cái trông giống với tên của người khác. Bạn có thể sử dụng điều này trong watermarking. Bản đồ ký tự trong Windows sẽ cung cấp cho bạn nhiều ký tự bất thường trông giống nhưng không giống với một chữ cái hoặc số mà bạn có thể sử dụng trong mã nguồn của mình. Những thứ này xuất hiện ở một vị trí cụ thể trong công việc của người khác không thể là ngẫu nhiên.

Dấu thời gian đáng tin cậy

Tóm lại, bạn gửi một tệp (hoặc hàm băm của nó) cho một bên thứ ba, sau đó họ sẽ gắn dấu thời gian vào nó và ký nó bằng khóa riêng. Bất kỳ ai muốn có bằng chứng về thời điểm bạn tạo tài liệu có thể truy cập bên thứ ba đáng tin cậy, thường là một trang web, để xác minh bằng chứng về thời gian tạo của bạn. Chúng đã được sử dụng trong các phiên tòa về tranh chấp sở hữu trí tuệ nên chúng là một dạng bằng chứng rất mạnh. Chúng là cách tiêu chuẩn để đạt được bằng chứng bạn đang tìm kiếm. (Tôi đã bao gồm những người khác b / c đầu tiên chúng dễ dàng, chúng vui nhộn hơn và có thể sẽ hiệu quả.)

Bài viết Wikipedia này có thể giúp người hướng dẫn của bạn hiểu bằng chứng của bạn và phần liên kết bên ngoài có nhiều nhà cung cấp, bao gồm cả những nhà cung cấp miễn phí. Tôi sẽ chạy các tệp thử nghiệm thông qua các tệp miễn phí trong vài ngày trước khi sử dụng chúng cho việc quan trọng.

Modus operandi

Vì vậy, bạn đã làm một cái gì đó và bây giờ bạn có bằng chứng phải không? Không, học sinh vẫn có thể nói rằng bạn đã đánh cắp ý tưởng từ họ hoặc một số điều vô nghĩa khác. Cách khắc phục của tôi cho điều này là, một cách riêng tư, thiết lập một hoặc nhiều phương pháp của tôi với người hướng dẫn của tôi. Tôi bảo người hướng dẫn tìm khoảng trắng, tìm ký hiệu nhất định, v.v. nhưng không bao giờ nói cho người khác biết hình mờ là gì. Nếu người hướng dẫn đồng ý giữ bí mật các kỹ thuật đơn giản của bạn, họ có thể sẽ tiếp tục hoạt động tốt. Nếu không, luôn có dấu thời gian đáng tin cậy. ;)


5
+1 - Câu trả lời hay, toàn diện. Có lẽ nên là câu trả lời được chấp nhận.
Andy Thomas

5
Thêm một ý tưởng nữa: Hãy mã hóa các chữ cái đầu của bạn thành tên biến, tên trường, tên phương thức, tên lớp,… Kẻ trộm sẽ rất khó để viết lại mọi thứ. (Tôi đã đề cập đến nó ở đây, vì nó là một bộ sưu tập tốt)
gaborsch

1
+1 GaborSch. Đó là một bổ sung tốt đẹp. Nếu bạn không mất điểm cho các tên phương thức không rõ ràng, thì chiến thuật có thể ít rõ ràng hơn theo cách đó và bản thân các chữ cái đầu có thể được lan truyền trong tên.
Nick P

4
Một ý tưởng khác mà bình luận của GaborSch truyền cảm hứng: cố ý viết sai chính tả một số thứ. Viết sai chính tả rất phổ biến của một số hàm hoặc tên biến. 10 người khác đã tự mình làm điều tương tự? Ừ đúng ... (Lưu ý: một nhà phê bình nổi tiếng về bản dịch kinh thánh của Thế giới mới đã tuyên bố rằng đây là một bản dịch nhái KJV và bằng chứng là một lỗi ngữ pháp hiếm gặp trong KJV nằm trong NWT "mới toanh". Vì vậy, có một tiền lệ cho việc này. )
Nick P

7
Một điểm cần lưu ý về "vân nước khoảng trắng" là nếu IDE (lại) định dạng mã của bạn (ví dụ: VS C # / Eclipse), chúng sẽ biến mất.
Alvin Wong

63

Nếu bạn cùng lớp lấy cắp mã của bạn từ trang tải lên, tôi sẽ mã hóa bài tập về nhà của bạn và gửi chìa khóa qua email cho giáo viên. Bạn có thể làm điều này với PGP nếu bạn muốn phức tạp hoặc một cái gì đó đơn giản như tệp Zip có mật khẩu.

CHỈNH SỬA: PGP sẽ cho phép bạn mã hóa / ký mà không để lộ khóa của bạn, nhưng bạn không thể đánh bại tính đơn giản của tệp Zip với mật khẩu, vì vậy chỉ cần chọn một khóa mới mỗi bài tập về nhà. Vẻ đẹp trong sự đơn giản :)


2
Đây là cách đơn giản nhất.
Jon Raynor

2
Làm thế nào để bạn chứng minh rằng mã là của bạn? Tôi có thể lấy cắp mã của bạn và zip như thể nó là của tôi.
gaborsch

4
@GaborSch, nếu tôi tải mã của mình lên tệp zip có mật khẩu, tôi sẽ thấy phiên bản bị đánh cắp của bạn ngay sau cái chết của mặt trời (với mật khẩu được chọn phù hợp)
SeanC

11
Bạn có thể chứng minh đó là mã của mình bằng cách cung cấp thành công khóa giải mã.
Jonathan S. Fisher

10
Chắc chắn, có nhiều lỗ hổng trên lý thuyết, nhưng trên thực tế, không ai có thể có quyền truy cập vào các tệp của anh ấy nếu anh ấy gửi nó được mã hóa: Có giới hạn về mức độ chúng sẽ đi và có giới hạn đối với khả năng của họ. Nếu họ không thể viết GUI cho bài tập về nhà của mình, thì rất có thể họ sẽ không sớm bẻ khóa mật khẩu hoặc xâm nhập vào máy tính của mọi người.
Supr

39

Nếu bạn đang cung cấp mã nguồn cho giáo viên, thì chỉ cần thêm serialVersionUID vào một trong các tệp lớp của bạn là phiên bản mã hóa của tên bạn. Bạn có thể tự giải mã cho giáo viên.

Điều đó không có ý nghĩa gì đối với những người khác, chỉ đối với bạn. Bạn có thể nói rằng đó là một mã được tạo, nếu họ ăn cắp nó, có lẽ sẽ không bận tâm đến việc sửa đổi nó.

Nếu bạn muốn làm điều đó một cách sành điệu, bạn có thể sử dụng thủ thuật này , nếu bạn tìm thấy hạt giống ngẫu nhiên tạo ra tên của bạn. :) Đó sẽ là số của bạn sau đó, và bất cứ nơi nào nó xuất hiện sẽ chứng minh rằng chính bạn là người tạo ra mã đó.


5
Kẻ trộm có thể thực hiện các thay đổi thẩm mỹ đối với mã để làm cho hành vi trộm cắp ít rõ ràng hơn. UID phiên bản nối tiếp sẽ là một thay đổi thẩm mỹ dễ dàng.
Andy Thomas

3
@GaborSch cái có serialVersionUID là hoàn hảo, cảm ơn đã phân bổ
LoremIpsum 17-04-13

2
@ AndyThomas-Cramer vâng, tôi nên lập trình một phương thức với tên mã hóa của mình trong đó và nếu nó bị xóa thì chương trình sẽ không hoạt động đâu haha
LoremIpsum

2
@ AndyThomas-Cramer Về lý thuyết là có. Trong thực tế, hầu hết những kẻ gian lận đều lười biếng và chỉ làm những điều tối thiểu tuyệt đối mà họ cho là cần thiết. (Có thể thay thế //written by WarGodNTbằng //Written by ImaCheata.) Cũng không chắc nhiều người trong số họ thậm chí biết svUID có thể phá họ. Ngay cả khi một vài trong số họ thông minh như vậy; nếu hầu hết cả lớp gian lận, một số ít gần như chắc chắn bị bắt. Ít nhất phải đủ để thuyết phục giáo viên hủy công bố quá trình của mình.
Dan Is Fiddling By Firelight

3
@WilQu: Bạn sẽ không ký mã của riêng mình bằng tên hoặc khóa riêng của người khác phải không?
Phục hồi Monica

35

Điều này đã xảy ra với một cặp sinh viên của tôi sống trong cùng một căn hộ. Một người đã lấy cắp mã nguồn từ một chiếc đĩa để trong ngăn bàn.

Kẻ trộm đã sửa đổi một chút nguồn bị đánh cắp để nó không bị lộ rõ. Dù sao thì tôi cũng nhận thấy sự giống nhau của mã và đã kiểm tra nguồn trong một trình soạn thảo. Một số dòng có thêm khoảng trắng ở cuối. Nguồn của mỗi học sinh có cùng số chỗ trống.

Bạn có thể khai thác điều này để mã hóa thông tin mà không làm cho nó hiển thị. Bạn có thể mã hóa tên viết tắt hoặc thẻ sinh viên của mình ở cuối một số dòng, có dấu cách.

Kẻ trộm có thể sẽ thực hiện các thay đổi thẩm mỹ đối với mã hiển thị, nhưng có thể bỏ sót các ký tự không hiển thị.

BIÊN TẬP:

Suy nghĩ về điều này nhiều hơn một chút, bạn có thể sử dụng dấu cách và tab dưới dạng dits và dahs mã Morse, và đặt tên của bạn ở cuối nhiều dòng. Kẻ trộm có thể xóa, sắp xếp lại hoặc gõ lại một số dòng mà không phá hủy giấy tờ tùy thân của bạn.

CHỈNH SỬA 2:

"Whitespace steganography" là thuật ngữ chỉ việc che giấu thư trong khoảng trắng. Googling nó cho thấy triển khai mã nguồn mở này có từ những năm 90, sử dụng mã hóa Huffman thay vì mã Morse.


2
Bạn được chào đón, cảm ơn vì câu hỏi. Đã cho tôi cơ hội để nghĩ về khoảng cách mã Morse.
Andy Thomas

1
Bất kỳ Java IDE có thể định dạng mã loại bỏ tất cả các nhân vật vô hình ;-) Tuy nhiên ý tưởng morse mã là đẹp :-)
Prakash K

5
Phần mở rộng: Trong bất kỳ ký tự nào của chuỗi, hãy thay thế một số khoảng trống bằng một ký tự trông giống như một khoảng trống. Như ký tự # 255 trong ASCII hoặc "khoảng trống không thể áp dụng" trong unicode. Hầu hết người mới sẽ không nhận thấy sự khác biệt và nó sẽ cho phép bạn xác định ai (có thể là!) Đã lấy cắp nguồn của bạn.
TheBlastOne

@PrakashK - Có, điều đó sẽ chống lại biện pháp này. Kết hợp nhiều biện pháp có lẽ là tốt nhất.
Andy Thomas

@TheBlastOne - Ý tưởng hay. Bản thân nó không xác định được bạn, nhưng nó sẽ không bị mất nếu kẻ trộm định dạng lại.
Andy Thomas

19

Nó có vẻ như là một vấn đề quản trị CNTT đối với tôi. Mỗi học sinh phải có khu vực tải lên riêng mà các học sinh khác không thể truy cập.

Giáo viên sẽ là một cấp cao hơn, có thể truy cập vào từng thư mục tải lên của học sinh. Nếu điều này là không thể, hãy sử dụng câu trả lời @exabrial vì đó là giải pháp đơn giản nhất.


9

Điều tốt nhất bạn có thể làm là chỉ cần nén mã nguồn với mật khẩu và gửi mật khẩu qua email cho giáo viên.

Vấn đề đã được giải quyết.


2
+1 đến các giải pháp đơn giản. Đừng thiết kế kỹ lưỡng nó. Nhưng hãy hỏi giáo sư xem anh ấy có ổn với điều này trước không.
Eduardo

6

Sử dụng hệ thống kiểm soát phiên bản phân tán (= độc lập) , như git . Cũng có thể hữu ích.

Lịch sử phiên bản với tên và ngày tháng của bạn có thể đủ thuyết phục.


2
Nhưng OP không thể không chứng minh rằng nguồn của anh ấy là do anh ấy tạo ra. Anh ấy gặp khó khăn khi chứng minh rằng các bạn cùng trường sử dụng nguồn tin của anh ấy cho của họ.
TheBlastOne

2
Một VCS phân tán khá phức tạp. Tất cả những gì tác giả cần là chứng minh tính nguyên bản của nội dung và / hoặc sao chép. Điều này có thể được thực hiện với bất kỳ cơ chế gửi tệp nào đánh dấu thời gian gửi, xác định người gửi và không cho phép sinh viên xóa bài nộp. Điều này có thể được thực hiện với một cái gì đó đơn giản như FTP hoặc máy chủ web.
Nick P

1
Khá dễ dàng để viết một tập lệnh sẽ quét nhật ký cam kết và tạo lại một kho lưu trữ mới với cùng lịch sử nhưng người dùng khác.
mikerobi

@mikerobi git filter-branchđược tạo ra cho những thứ điên rồ như vậy, điều đó không dễ dàng gì
Izkata

@Izkata, tôi đã không tính đến khả năng thay đổi lịch sử sửa đổi. Tôi đang nghĩ đến một tập lệnh kiểm tra bản sửa đổi đầu tiên và cam kết nó vào một repo khác, sau đó kiểm tra bản sửa đổi thứ hai và vá lỗi các lần lặp lại repo mới. Tương tự như cách một số công cụ chuyển đổi từ VCS này sang công việc khác.
mikerobi

3

Cái gì đã bị đánh cắp?

  • Nguồn ? Bạn có thể đặt các Chuỗi ngẫu nhiên trong đó (nhưng nó có thể được thay đổi). Bạn cũng có thể thử thêm một hành vi đặc biệt mà chỉ bạn mới biết (một phím bấm đặc biệt sẽ thay đổi một hàng màu), sau đó bạn có thể hỏi giáo viên "những người khác biết combo đặc biệt này không?". Cách tốt nhất là sẽ làm hỏng chương trình nếu một tệp trống vô dụng không có trong kho lưu trữ sau 5 phút hoạt động, các bạn cùng trường của bạn sẽ quá lười biếng để đợi khoảng thời gian này.

  • Nhị phân? Chỉ cần so sánh tổng tổng của mỗi lớp .class là đủ (các bạn cùng trường của bạn quá lười biếng để viết lại các tệp lớp)


2

Chỉ cần đăng giải pháp của bạn vào phút cuối cùng. Điều này sẽ không có thời gian cho bất kỳ ai sao chép nó.

Và gửi phản hồi cho quản trị viên để không cho phép học viên xem bài tập của học viên khác.


1

Nếu bạn tải tệp lên ở dạng .zip có mã hóa mật khẩu, bất kỳ ai cũng có thể bẻ khóa mật khẩu bằng cách tải xuống tệp .zip và yêu cầu cpu của họ chạy hàng triệu truy vấn nếu họ là kẻ trộm gian lận. Thật không may, một số và nó rất dễ thực hiện.

Các sinh viên khác có thể xem nguồn của bạn trên máy chủ chia sẻ. Giáo viên thực sự nên cung cấp cho bạn thư mục được mã hóa bằng mật khẩu của riêng bạn để tải lên. Điều này có thể được thực hiện dễ dàng chỉ bằng cách thêm tên miền phụ. Nhưng có lẽ giáo viên có thể cho phép bạn tải các tệp lên máy chủ của riêng bạn để ông ấy truy cập chúng ở đó.

Cũng có thể làm xáo trộn tập lệnh để nó có document.write ('Trang này được viết bởi xxxxx'), buộc bất kỳ ai sao chép tác phẩm của bạn không thể xóa tín dụng trừ khi họ giải mã nó trước. Nhưng câu trả lời thực sự là trường học của bạn cần cung cấp cho mỗi sinh viên của mình những thư mục được bảo vệ bằng mật khẩu riêng của họ.


0

Trong trường hợp của tôi, các giáo viên của tôi đã có một cách tiếp cận tốt hơn. Các câu hỏi họ cung cấp có liên quan đến số đăng ký của chúng tôi. Ví dụ:

Đầu vào cho một chức năng / lý thuyết là Số đăng ký của chúng tôi, số này khác nhau đối với mỗi sinh viên

Vì vậy, câu trả lời hoặc cách tiếp cận giải pháp là tương đối khác nhau ở mỗi học sinh. có thể khó hơn học bớt;)].

Hope your lecturer will read this thread before his next tutorial :D
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.