Làm thế nào tôi có thể ẩn chữ ký của mình trong một chương trình? [đóng cửa]


31

Chúng tôi có một khóa học lập trình đại học và các sinh viên đang hỏi một số câu hỏi lập trình trong nhóm Facebook của chúng tôi. Tôi hơi do dự khi chia sẻ tất cả các chương trình của mình, đặc biệt nếu đó là một điều thú vị đối với một trong những bài tập, vì chúng được các TA xem xét và họ có thể nhận thấy nếu ai đó có cùng chương trình và bắt đầu đặt câu hỏi về nơi nó đến từ. Tuy nhiên, đôi khi tôi muốn chia sẻ mã của mình để giúp đỡ người khác, nhưng tôi không muốn mọi người chỉ lấy công việc của tôi. (Làm rõ: Chúng tôi được phép cộng tác với các nhiệm vụ) Đây tất nhiên là một dòng mỏng. Trong khi tôi muốn giúp đỡ một số người, tôi lo ngại rằng họ có thể không có sự trung thực trong học thuật để tự viết lại mã.

Hầu hết các sinh viên đồng nghiệp của tôi không được nâng cao về kỹ năng của họ, vì vậy tôi sẽ tránh xa việc nói giấu tên tôi trong chuỗi mã hóa Base-64 được chế tạo ở một nơi riêng biệt. Tuy nhiên, có thể quá rõ ràng cho một chuỗi ngẫu nhiên được ngồi xung quanh.

Những tùy chọn tồn tại để ẩn tên của tôi trong một chương trình mà không có vẻ đáng ngờ?

Tôi đã thấy ở CodeGolf rằng họ đã biến nghệ thuật ascii biến thành những thứ khác khi được đánh giá. Có những chiến lược tương tự tôi có thể sử dụng? Giải pháp lý tưởng sẽ là một cái gì đó trông giống như một cái gì đó phù hợp kín đáo nhưng trong thực tế có một chức năng để chứng minh rằng tôi đã mã hóa nó ngay từ đầu.

Làm rõ: (Xin lỗi, đáng lẽ phải nói điều này sớm hơn) Chúng tôi được phép cộng tác nhưng phải giải thích các chương trình của chúng tôi cho các TA để lấy điểm. Chỉ cần thỏa mãn để giấu một số Trứng Phục sinh trong mã của người khác nếu nó bị rò rỉ, đặc biệt là vì có thể rất khó để trao đổi các chương trình để kiểm tra xem câu trả lời cho các vấn đề mà họ tạo ra có tương đương không, hoặc để xem cách người khác giải quyết vấn đề.


70
không chia sẻ mã mà chia sẻ ý tưởng
ratchet freak

7
Những gì tôi đã làm vài năm trước là có một biến với một tên cụ thể (Trong trường hợp của tôi: "pkmn") mà tôi đã sử dụng trong mọi mã tôi đã viết, cho những thứ không đáng chú ý (loại mà bạn thường gọi là "i", " j "...). Khi ai đó đánh cắp mã của tôi, họ đã không duyệt hết mã và không để lại biến. Đó là chữ ký của tôi.
DrakaSAN

29
Vì sao bạn lại hỏi chúng tôi? Hỏi giáo sư hoặc TA về hành vi thích hợp ở trường của bạn .
Eric Lippert

6
Đây là một ứng dụng của steganography . Thông thường các ứng dụng trong thế giới thực liên quan đến việc ẩn tin nhắn trong âm thanh, hình ảnh hoặc các định dạng mất dữ liệu khác, nhưng trường hợp chung được áp dụng ở đây. Câu trả lời được chấp nhận là một câu hỏi hay nhưng tôi cũng khuyên bạn nên tìm hiểu về steganography.

2
Làm thế nào về việc chỉ đăng mã bị hỏng một cách tinh tế?
Stewol

Câu trả lời:


44

Sử dụng chữ ký của bạn không phải trong mã của bạn, nhưng trong nhật ký phát triển có thể truy cập công khai.

Xuất bản mã của bạn tại một repo Github công khai. Bao gồm một Docblock với tên của bạn trong trường "Tác giả". Bằng cách này, có một hồ sơ công khai về bạn là tác giả thực sự của chương trình.


Điều này có thể không đủ điều kiện là "ẩn", nhưng theo tôi, nó có. Nếu một sinh viên quyết định sao chép mã của bạn, họ sẽ nghĩ rằng họ chỉ phải trao đổi chữ ký của họ cho bạn. Hãy tưởng tượng sự ngạc nhiên của họ khi bạn trình bày bằng chứng công khai về việc làm sai trái của họ. Để làm cho vấn đề tồi tệ hơn đối với họ, nó có thể truy cập trực tuyến. Bạn thậm chí có thể sử dụng một công cụ trực tuyến, chẳng hạn như Diffchecker , để chứng minh phần nào trong mã của bạn đã bị đánh cắp!

EDIT: Như đã nêu trong các bình luận, hãy đảm bảo trường học của bạn cho phép chia sẻ công việc của bạn theo cách này! OP chỉ ra rằng tổ chức của họ ổn với điều này, nhưng tổ chức của bạn thì không!


26
@exizt - Trong khi đây là một ý tưởng tốt sau một môi trường học đường. Tôi nghi ngờ rằng hầu hết các tình huống chính thức trong môi trường học đường sẽ chấp nhận điều này bởi vì cuối cùng bạn vẫn chia sẻ công việc của mình với các sinh viên khác. Tốt nhất là rời khỏi trường học của bạn làm việc của riêng bạn (và của riêng bạn) cho đến khi bạn nhận được một lớp cho nó.
Ramhound

4
@exizt - Giáo sư lo lắng về gian lận. Trừ khi giáo sư nói rằng bạn có thể làm việc với một sinh viên khác, họ bình thường có một kỳ vọng rằng bạn sẽ không đào mã từ các đồng nghiệp của mình. Nếu bạn cần với chương trình, có một kỳ vọng bạn sẽ đến TA và / hoặc giáo sư không phải là đồng nghiệp của bạn. Đó là lý do tôi đề nghị giữ công việc của bạn cho đến khi bạn nhận được điểm. Trong khi tất cả ấm áp và mờ nhạt, tác giả muốn giúp đỡ đồng nghiệp của mình, đó không phải là vấn đề của anh ấy, họ không thể thực hiện công việc mà không có sự giúp đỡ. Anh ta có thể giúp không có bằng chứng về hành động như vậy Nếu anh ta muốn ngồi đó và giải thích điều gì đó
Ramhound

4
Làm thế nào điều này sẽ giải quyết các tác giả ban đầu? Người ăn cắp mã của bạn có thể đơn giản tuyên bố rằng họ đã viết nó trước khi đăng ký github của bạn và rằng bạn đã đánh cắp nó từ họ. Tôi không thấy điều này giải quyết vấn đề trong câu hỏi.
Adam Davis

7
Có bằng TA ở trường đại học của tôi, tôi biết một sự thật (và từ việc xem nó xảy ra) rằng làm theo câu trả lời này sẽ khiến bạn bị trích dẫn vì hành vi sai trái trong học tập. Tôi không biết về bất kỳ chính sách đại học nào ở nước tôi (Úc), phân biệt giữa người sao chép và người sao chép liên quan đến đạo văn, và tôi nghi ngờ nó sẽ khác biệt đáng kể ở bất kỳ nơi nào khác. An toàn hơn nhiều để giữ mã của bạn cho chính mình!
sapi

2
Git cho phép cam kết đặt bất kỳ dấu thời gian nào mà nó muốn. Vì vậy, tôi nghi ngờ bạn có thể dựa vào một repo git cho bất kỳ loại bằng chứng.
Zan Lynx

14

"Vì những người này được các TA xem xét và họ có thể nhận thấy nếu ai đó có cùng chương trình"

Tôi hy vọng vậy, đó là một phần công việc của họ để phát hiện và trừng phạt gian lận, đạo văn và gian lận khác.
Và sao chép công việc của người khác và biến nó thành của riêng bạn, đó là gian lận và đạo văn.

Rất đơn giản: đừng giao công việc của bạn cho người khác. Giúp họ tự viết nếu bạn muốn bằng cách cho họ ý tưởng về cách giải quyết vấn đề, sau đó để họ tự viết mã.


Chơi lô tô. Nguyên tắc đầu tiên của việc dạy kèm là bạn nên giúp mọi người tự tìm giải pháp. Nếu bạn không muốn mọi người đánh cắp mã của bạn, đừng cung cấp cho họ mã. Nếu bạn muốn giúp đỡ họ, hãy xuất bản các gợi ý, danh sách các thuật toán và cấu trúc dữ liệu hữu ích hoặc các mô tả cấp cao về giải pháp.
Sean McS Something

2
Có nhiều thứ để đạt được từ sự hợp tác cấp mã. 1) Thực hành giải thích mã cho người khác 2) Xây dựng mối quan hệ làm việc 3) Học tài năng của bạn cùng lớp 4) Học từ bạn cùng lớp khi bạn không có giải pháp tốt nhất. Các nhóm nỗ lực sẽ vượt trội hơn các ngôi sao trên đảo. Học sinh sẽ luôn luôn là kẻ thù; OP đang cố gắng tận dụng tối đa từ phía bạn bè trong khi giảm nhẹ chống lại kẻ thù không thường xuyên.
duozmo

@duozmo không có gì sai khi làm việc cùng nhau (NẾU việc chuyển nhượng cho phép tất nhiên), miễn là cuối cùng bạn không làm việc của người khác cho họ. Và không, các sinh viên của tôi không bao giờ là kẻ thù khi tôi học đại học. Tồi tệ nhất họ là đối thủ cạnh tranh cho các bài tập tốt nhất.
jwenting

7

Giống như câu trả lời ở trên, tôi khuyến khích sử dụng một cái gì đó như Github để ghi lại quá trình phát triển mã của bạn, có những phương pháp khác mà bạn có thể sử dụng để che lưng như gửi email cho chính mình trước khi chia sẻ mã, mặc dù kho lưu trữ có thể xem công khai những gì tôi muốn đề nghị.

Đó là điều tất nhiên nếu việc chia sẻ mã là rất cần thiết. Mã giả thì sao? hoặc như "ratchet freak" đã nêu, chia sẻ ý tưởng không phải là việc thực hiện. (điều này có ý nghĩa hơn đối với mã phức tạp hơn)


7

Bạn cũng có thể sử dụng một trong những thủ thuật lâu đời nhất trong việc ẩn tin nhắn. Tạo chữ cái đầu tiên của mỗi biến ẩn một tin nhắn. Ví dụ,

$Image = "test";
$a = "/test/img.jpg";
$message = "This is img.jpg";
$Full = 435674;
$rate = 3;
$ascii = "---....!--";
$number = 2040;
$k = 5;

// Do some work here?

6
Tôi sẽ không phụ thuộc vào thứ gì đó như thế này - nếu họ đang sử dụng mã của anh ấy, thay đổi xung quanh tên biến và thứ tự sẽ là một bước rõ ràng để tránh bị bắt gặp sao chép.
thegrinner

6

Tôi nghĩ rằng GitHub hoặc một giải pháp tương tự là ổn, NHƯNG có hai điều cần xem xét:

  • Điều này vẫn đang giao công việc của bạn cho những người được cho là tự làm, vì vậy nó có thể bị trừng phạt cho dù bạn có giấu một loại trứng Phục sinh trong đó hay không.
  • Chính sách của trường thực sự có thể khá hạn chế đối với những điều như vậy. Ví dụ, ở Đức, có một số trường đại học, thậm chí còn bắt sinh viên của họ ký một loại "hợp đồng", trong đó nêu rõ mọi thứ họ phát triển như một phần của nhiệm vụ được đưa ra trong khóa học này và khóa học đó là tài sản của trường đại học và không thể được phân phối dưới mọi hình thức mà không có sự cho phép rõ ràng của tổ chức. Vì vậy, trước khi đăng nội dung học lên Internet, tôi khuyên bạn nên hỏi (thường có những người làm việc về những điều này trong mỗi cơ sở giáo dục và khoa học), bởi vì bạn thực sự có thể gặp rắc rối và điều đó tôi không có nghĩa là nhận được một F, nhưng tồi tệ hơn nhiều. Nếu bạn thực sự muốn giúp đỡ bạn bè của bạn,

Đây là tất cả những điểm rất tốt! Tôi đã không xem xét tất cả chúng trong câu trả lời của tôi.
sbichenko

cảm ơn vì đã quan tâm, những điểm tốt :) chúng tôi được phép cộng tác với những người khác trong các nhiệm vụ nhưng tôi không muốn mọi người sao chép mã của tôi cho nhiệm vụ của họ nếu tôi chia sẻ một số điều đó.
MikeFoxtrot

4

Người vẽ bản đồ có cùng một vấn đề . Một vài kỹ thuật:

  1. Giới thiệu một sai lệch không thể xảy ra so với phong cách truyền thống của ngôn ngữ của bạn, ví dụ: luôn có không gian mất cân bằng xung quanh các nhà khai thác

    if (lefthand== righthand)

  2. Phân tán no-op trong toàn bộ mã của bạn, nếu chúng là một phần của ngôn ngữ bạn đang sử dụng.

    lefthand = righthand;;


(1) sẽ sụp đổ nếu sinh viên đang sử dụng một cái gì đó như trình định dạng tự động của Eclipse. (2) với NOP là một điều tốt đẹp.
Richard Le Mesurier

Làm thế nào bạn sẽ chứng minh mọi người đã sao chép vào bạn và không phải là cách khác?
Pierre Arlaud

2
@ArlaudPierre như một người trước đây đã nói rằng mánh khóe này là sử dụng một cái gì đó như thế này cho tất cả các chương trình từ đầu năm, để bạn có thể chứng minh rằng bạn đã cố ý và người khác thì không.
MikeFoxtrot

Cái đầu tiên là blech và, như đã chỉ ra, dễ dàng bị đánh bại bởi một kẻ định dạng; thứ hai sẽ đưa ra cảnh báo trong bất kỳ IDE tốt.
David Conrad

3

Ngăn chặn đạo văn KHÔNG phải là công việc của bạn khi còn là sinh viên, đó hoàn toàn nằm trong tay một người hướng dẫn / TA.

Nói chung đối xử với trường học như nó là kinh doanh nguồn đóng. Đồng bào của bạn là đồng nghiệp cho các nhà tuyển dụng khác. Bạn không thể chia sẻ mã ngoài một lớp đơn giản và như vậy, và bạn KHÔNG BAO GIỜ chia sẻ toàn bộ các lớp hoặc dự án.

Ẩn "Trứng Phục sinh" trong mã thường được xem là không chuyên nghiệp. (Ý kiến ​​có thể thay đổi ở đây)

Đừng biến mã có chữ ký của bạn

"Chữ ký" của bạn hoặc cách bạn phân biệt mã của mình với người khác phải thật trang nhã và không cản trở "mã" của bạn theo bất kỳ cách nào. Đây là lý do tại sao tôi mạnh mẽ ngăn cản những điều sau đây:

  • Cố ý viết sai chính tả (biến, tên phương thức)
  • Cố ý thêm mã "lẻ" như no-op cho mục đích đánh dấu mã là của bạn.
  • Sử dụng cấu trúc mã không chuẩn hoặc bất thường (khoảng trắng, ngắt dòng, ect)
  • Sử dụng các mẫu mã không chuẩn hoặc bất thường (logic mã thực tế)
  • Mã không cần thiết mã hóa (phương pháp chôn với các phương thức không có lý do)
  • Bất kỳ loại mánh khóe hoặc thuật sĩ mã nào khác để thử và phân biệt nó theo một cách khác thường.

Vậy thì làm cách nào để bảo vệ mã của tôi?!

Nói chung, hạn chế tính khả dụng là cách tốt nhất để bảo vệ mã của bạn. Nếu bạn không công khai và không ai hack máy tính của bạn, mã của bạn thường an toàn. Chắc chắn rằng nó có thể được dịch ngược, thiết kế ngược, v.v. Vào thời điểm đó, nó không giống như mã sẽ tạo ra mã nào.

Tôi muốn công khai, nhưng ngăn không cho nó đạo văn

Chỉ là không ... Bằng mọi cách, thuật sĩ lộn xộn trong mã của bạn có thể khiến một kẻ đạo văn nổi bật với giả định rằng họ cũng cung cấp mã của họ ... và họ sẽ không .

Nó cũng sẽ khiến bạn trông khủng khiếp khi người khác nhìn qua mã của bạn và đi. "cái quái gì với tất cả các lỗi chính tả và không-op?"

Nhưng tôi muốn một chữ ký mã, một cái gì đó tôi có thể nhìn vào mã và nói rằng tôi đã làm điều này, đó là tôi, đây là của tôi

Thành thật mà nói, nếu bạn viết mã tốt, nó thường không thể phân biệt được với bất kỳ mã nào khác trong các dự án bạn làm việc. Chắc chắn chúng có thể là những sắc thái cho bạn biết những gì bạn đã làm so với những gì Bob đã làm, nhưng những điều này khá nhẹ.

Mã thời gian duy nhất nổi bật theo cách lớn giữa các đồng nghiệp là nếu một cái gì đó mới và chưa từng được thực hiện trước trong vòng tròn của bạn, hoặc nó có mùi theo cách duy nhất cho vòng tròn của bạn.


Bạn muốn "so với", không phải "câu thơ". Trừ khi bạn và Bob đang viết thơ. ;)
David Conrad

@DavidConrad Cảm ơn bạn, mã là thơ sau tất cả;) sửa cho phù hợp.
RualStorge

1

Cho rằng vấn đề là ẩn chữ ký trong mã nguồn

  • nó sẽ không rõ ràng ngay lập tức
  • nó không thể được gỡ bỏ ngẫu nhiên hoặc vô tình
  • nó có thể được phục hồi khi cần thiết, đến một mức độ chắc chắn sẽ tạo thành bằng chứng.

Một biến thể thú vị trên Steganography .

Bạn không thể sử dụng định dạng hoặc khoảng trắng, bởi vì bất kỳ IDE có thẩm quyền nào cũng có thể bị xóa một cách tầm thường.

Điều đó thực sự chỉ để lại tên của các biến và chức năng. Bạn không thể sử dụng một chuỗi con đặc biệt phổ biến, bởi vì nó quá dễ dàng bị loại bỏ bởi một tìm kiếm và thay thế. Điều đó khiến cho việc sử dụng các tên biến đặc biệt và nguyên bản sẽ phải được loại bỏ riêng lẻ. Lỗi chính tả và từ ngữ ngoại ngữ là những ứng cử viên tốt.

if (a== x) {}   // disappears on reformatting
int gghhjj_i;   // easily removed by search and replace, if all the same
int couunt = 0;  //spelling
int nummer = 0; // german
float doppel = 0.0; // german
string spago = "xx"; // italian
boolean manana = true; // spanish
struct perzon;  // excess use of z's.
class employeej; // what if every variable contained a 'j'?

Cơ hội cho sự sáng tạo là vô biên!

Sau đó, một số xử lý văn bản đơn giản để trích xuất và so sánh các mã thông báo sẽ nhanh chóng phát hiện ra những kẻ đạo văn.


2
Tôi thực sự sẽ ngăn cản điều này. Trong khi A khen ngợi cách sáng tạo để giải quyết vấn đề này, những điều này có thể dẫn đến những thói quen mà không một chuyên gia nào muốn giải quyết. Sửa đổi một bức thư, vv không phải là xấu nhưng cố ý viết sai chính tả là một thói quen khủng khiếp cần có khi bạn làm việc theo nhóm. "Ồ này, nó nằm trong thư mục 'chung'", "Tôi không tìm thấy bất kỳ thư mục nào có tên 'chung'", "Ôi trời ơi, ý tôi là 'commom'", "... đó là 'com_mom', 'comm_mom', ' commmom 'hoặc' commom '... "
RualStorge

Rõ ràng là bạn chưa từng làm việc với một số bệnh ung thư nhất định mà tiếng Anh không phải là ngôn ngữ đầu tiên. Tôi đã đếm 11 cách viết khác nhau của từ 'thông báo' (ít nhất đó là những gì tôi nghĩ chúng là).
david.pfx

Tôi có, "Commom" đã đến theo cách chính xác đó. Đó là thứ chúng tôi đã sống với nó cho đến khi nó chọc giận ai đó đủ để sửa bất cứ lời nói xúc phạm nào trong ngày. Thêm vào vấn đề này với mục đích nổi bật là "chữ ký của bạn" là đáng tin
cậy

@RualStorge: À. Một câu trả lời khéo léo, nhưng không phải là một để trót lọt trong một cuộc phỏng vấn có lẽ?
david.pfx

1
Không, nhưng sau đó một lần nữa có nhiều điều người ta không nói trong một quá trình phỏng vấn. Chẳng hạn như vào một công ty có quản lý dự án kém ... Người ta không nói rằng họ có kế hoạch chủ động sử dụng sự khuất phục tinh vi và không tuân thủ đường biên để cải thiện thực tiễn và chính sách của công ty, nhưng ở đây chúng tôi;)
RualStorge

1

đề xuất về tiếng ồn của duozmo có thể sẽ tạo ra các dấu hiệu kém cho sự chậm chạp, nhưng đó có thể là một điều tốt để đưa vào ví dụ mã không được sử dụng nguyên văn.

Điều đó truyền cảm hứng cho tôi để nghĩ về một mẫu chữ ký xen kẽ của các tab và khoảng trắng trong cả khoảng trắng hàng đầu và dấu.



0

Một cái gì đó tương tự tôi đã sử dụng trước đây là tạo các biến có tên giống như các biến quan trọng khác nhưng đặt tên của chúng tùy thuộc vào trình soạn thảo văn bản để thay đổi không dễ dàng rõ ràng hoặc sử dụng các chữ cái có dấu. Gọi một số hàm, mà bạn gửi nhiều biến quan trọng của chương trình từ câu lệnh if, sử dụng các biến của bạn, điều này sẽ không bao giờ đúng, ví dụ: (1eft == wrōng) Đặt một số biến quan trọng trong hàm vô dụng cho chữ ký bị che khuất của bạn.

Bạn sẽ có thể tìm thấy một số hướng dẫn về 'Cách viết mã không thể nhầm lẫn' có thể giúp ích.


Tuy nhiên, điều này sẽ làm bạn mất điểm vì các chương trình không tốt như họ nên và các TA sẽ không thể đọc chúng
user151019

Điểm của bạn sẽ bị phạt vì điều này thường nếu được chú ý. Không ai thích khi bạn tìm kiếm "logRep repository" chỉ để thấy nó thực sự là "1ogRep repository", nó chỉ khiến bạn trông tệ.
RualStorge

Điều đó nói với tôi. Tôi sẽ lấy áo khoác.
sanepete
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.