액세스로부터 자바 소스 코드 보호 [닫기]


96

지난주에 저는 숙제를위한 작은 GUI를 만들어야했습니다. 학교 동료 중 누구도 그렇게하지 않았습니다. 그들은 우리가 그것을 업로드해야했던 곳에서 내 파일을 훔친 다음 다시 자신의 것으로 업로드했습니다. 내가 선생님에게 모든 일이 내 일이라고 말했을 때 그는 나를 믿지 않았습니다.

그래서 쓸모없는 방법이나 내가 그것을 코딩했다는 증거와 함께 내부에 넣는 것을 생각했습니다. 나는 암호화를 생각했다. 지금까지 내 최고의 아이디어 :

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

다른 더 나은 방법을 생각할 수 있습니까?


31
업로드 사이트에 파일에 타임 스탬프가 없습니까?
Averroes

76
코드를 업로드 한 곳에서 다운로드 할 수 있다는 말입니까? 미친 것 같습니다. 선생님의 방법에 대해 질문해야합니다. 사장님이 약간 불합리 해 보이기 때문에 가급적이면 상사와 이야기를 나누는 것이 좋습니다.
keyser 2013-04-17

56
Epic은 숙제 중 하나를 실패하고 전체 수업이 실패하게합니다.
-04-17 개최

25
교사가 초보자가 ...뿐만 아니라처럼 보인다
UmNyobe

22
이 상황에서 할 수있는 유일한 현명한 일은 숙제를 업로드하는 방법에 대해 교사와 이야기하여 문제를 바로 잡는 것입니다. 다른 모든 사람의 제출물을 다운로드 할 수있는 영역에 업로드하는 것은 어리석은 일입니다. 그 접근 방식이 좋은 것이라고 생각하는 교사가 실제로 가르치고 있어야할지 모르겠습니다!
Michael Berry

답변:


104

나는 오래 전에 당신과 같은 문제를 겪었습니다. 우리는 Windows 2000 컴퓨터를 가지고 있었고 모든 사람이 볼 수있는 Novel 네트워크 폴더에 파일을 업로드했습니다. 나는 최고의 도둑을 물리 치기 위해 몇 가지 트릭을 사용했다 : 공백 워터 마킹; 메타 데이터 워터 마킹; 특이한 캐릭터; 신뢰할 수있는 타임 스탬프 운영 방식. 여기에 순서대로 있습니다.

공백 워터 마킹 :

이것은 워터 마킹에 대한 저의 원래 기여입니다. 텍스트 파일에서 작동하는 보이지 않는 워터 마크가 필요했습니다. 내가 생각 해낸 비결은 프로그래밍 문 (또는 문단) 사이에 특정 공백 패턴을 넣는 것이 었습니다. 파일은 그들에게 똑같이 보였습니다 : 일부 프로그래밍 문과 줄 바꿈. 텍스트를 신중하게 선택하면 공백이 표시됩니다. 각 빈 줄에는 분명히 무작위 또는 우연이 아닌 특정 수의 공백이 포함됩니다. (예 17) 실제로이 방법은 문서에 포함 된 내용을 파악할 수 없었기 때문에 저에게 효과적이었습니다.

메타 데이터 워터 마킹

여기에서 정보를 포함하도록 파일의 메타 데이터를 변경합니다. 파일의 보이지 않는 부분, 특히 EXE에 이름, 해시 등을 포함 할 수 있습니다. NT 일에는 대체 데이터 스트림이 인기가있었습니다.

특이한 캐릭터

나는 단지 킥을 위해 이것을 던질 것입니다. 오래된 IRC 명의 도용 트릭은 다른 사람의 이름과 비슷한 글자로 이름을 만드는 것이 었습니다. 워터 마킹에 사용할 수 있습니다. Windows의 문자표는 소스 코드에서 사용할 수있는 문자 또는 숫자와 비슷해 보이지만 그렇지 않은 많은 특이한 문자를 제공합니다. 다른 사람의 작업에서 특정 지점에 표시되는 것은 우연이 아닙니다.

신뢰할 수있는 타임 스탬프

간단히 말해서, 파일 (또는 해시)을 제 3 자에게 보낸 다음 여기에 타임 스탬프를 추가하고 개인 키로 서명합니다. 문서를 언제 만들 었는지 증명을 원하는 사람은 누구나 신뢰할 수있는 제 3 자 (주로 웹 사이트)를 방문하여 생성 시간 증명을 확인할 수 있습니다. 이들은 지적 재산권 분쟁에 대한 법원 소송에서 사용되었으므로 매우 강력한 형태의 증거입니다. 그들은 당신이 찾고있는 증거를 성취하는 표준 방법입니다. (나는 다른 사람들을 먼저 포함 시켰습니다. 그들은 쉬우 며, 더 재미 있고 아마도 작동 할 것입니다.)

이 Wikipedia 기사 는 강사가 증거를 이해하는 데 도움 될 수 있으며 외부 링크 섹션에는 무료 제공 업체를 포함하여 많은 제공 업체가 있습니다. 중요한 일에 사용하기 전에 며칠 동안 무료 파일을 통해 테스트 파일을 실행했습니다.

운영 방식

그래서, 당신은 뭔가를했고 이제 당신은 증거를 가지고 있습니까? 아니요, 학생들은 여전히 ​​당신이 그들에게서 아이디어를 훔쳤거나 다른 말도 안된다고 말할 수 있습니다. 이것에 대한 나의 해결책은 개인적으로 강사와 함께 나의 방법 중 하나 이상을 설정하는 것이 었습니다. 나는 강사에게 공백과 특정 기호 등을 찾도록 지시하지만 워터 마크가 무엇인지 다른 사람에게는 절대 말하지 말라고합니다. 강사가 귀하의 간단한 기술을 비밀로 유지하는 데 동의하면 아마도 계속해서 잘 작동 할 것입니다. 그렇지 않은 경우 항상 신뢰할 수있는 타임 스탬프가 있습니다. ;)


5
+1-훌륭하고 포괄적 인 답변입니다. 아마도 받아 들여진 대답이어야합니다.
Andy Thomas

5
한 가지 더 아이디어 : 변수 이름, 필드 이름, 메서드 이름, 클래스 이름 등으로 이니셜을 인코딩하십시오. 도둑은 모든 것을 다시 작성하기가 어려울 것입니다. (그것이 좋은 컬렉션이기 때문에 나는 여기 언급)
gaborsch

1
+1 GaborSch. 그것은 좋은 추가입니다. 모호한 메서드 이름에 대한 요점을 풀지 않으면 전술이 덜 명확해질 수 있으며 이니셜 자체가 이름 내에 퍼질 수 있습니다.
Nick P

4
GaborSch의 의견에서 영감을 얻은 또 다른 아이디어는 특정 항목의 철자를 의도적으로 잘못 입력하는 것입니다. 일부 함수 또는 변수 이름의 매우 드문 철자를 잘못 입력합니다. 10 명의 다른 사람들이 스스로 같은 일을 했나요? 네 맞습니다 ... (참고 : New World 성경 번역에 대한 한 저명한 비평가는 KJV 모조품이라고 주장했으며 KJV의 드문 문법 오류가 "새로운"NWT에 있었다는 증거입니다. 따라서이 작업에 대한 선례가 있습니다. )
Nick P

7
"공백 워터 마킹"에 대해 주목해야 할 점은 IDE가 코드 형식 (예 : VS C # / Eclipse)을 (재) 포맷하면 사라진다는 것입니다.
Alvin Wong

63

반 친구들이 업로드 사이트에서 코드를 훔친 경우 숙제를 암호화하고 키를 교사에게 이메일로 보냅니다. 복잡하거나 암호가있는 Zip 파일처럼 간단한 작업을 원할 경우 PGP로이 작업을 수행 할 수 있습니다.

편집 : PGP를 사용하면 키를 공개하지 않고 암호화 / 서명 할 수 있지만 암호가있는 Zip 파일의 단순함을 이길 수는 없으므로 모든 숙제를 할당 할 때마다 새 키를 선택하기 만하면됩니다. 단순함의 아름다움 :)


2
이것은 가장 간단한 접근 방식입니다.
Jon Raynor

2
코드가 귀하의 것인지 어떻게 증명합니까? 나는 당신의 코드를 훔쳐서 마치 내 것처럼 압축 할 수 있습니다.
gaborsch

4
나는 암호로 zip 파일로 내 코드를 업로드하면 @GaborSch는, 나는 (적절하게 선택 암호로) 곧 태양의 열 사망 후 도난 버전을 볼 수 있습니다
SeanC

11
암호 해독 키를 성공적으로 제공하여 코드임을 증명할 수 있습니다.
Jonathan S. Fisher

10
물론 이론에는 많은 허점이 있지만 현실적으로 암호화 된 파일을 보내면 누구도 자신의 파일에 액세스 할 수있을 것 같지 않습니다. 파일이 얼마나 멀리 갈 수 있는지에 대한 제한이 있으며 능력에도 제한이 있습니다. 숙제를위한 GUI를 작성할 수 없다면, 곧 암호를 크래킹하거나 다른 사람의 컴퓨터를 해킹하지 않을 가능성이 있습니다.
Supr

39

교사에게 소스 코드를 제공하는 경우 serialVersionUID이름의 암호화 된 버전 인 수업 파일 중 하나에를 추가하기 만하면 됩니다. 교사에게 직접 해독 할 수 있습니다.

그것은 다른 사람들에게 아무런 의미가 없습니다. 생성 된 코드라고 말할 수 있습니다. 그들이 훔친다면 아마 전혀 수정하지 않을 것입니다.

스타일리시하게하고 싶다면, 당신 의 이름을 생성하는 임의의 시드를 찾으면 이 트릭을 사용할 수 있습니다 . :) 그것은 당신의 번호 가 될 것이고 , 그것이 나타날 때마다 그 코드를 만든 것이 당신 이라는 것을 증명할 것입니다 .


5
도둑은 도난을 덜 분명하게 만들기 위해 코드를 외관상으로 변경할 수 있습니다. 시리얼 버전 UID는 외관상 쉽게 변경할 수 있습니다.
Andy Thomas

3
serialVersionUID의와 하나가 완벽한 감사 충당입니다 @GaborSch
로렘 입숨

2
@ AndyThomas - 크레이머 그래, 난 거기에 내 암호화 되 이름을 가진 방법을 programm에해야하고 그것은을 programm 못해 작업 하하를 제거하면
로렘 입숨

2
@ AndyThomas-Cramer 이론적으로 그렇습니다. 실제로 대부분의 사기꾼은 게으르고 필요하다고 생각하는 최소한의 작업 만 수행합니다. (아마으로 대체 될 것 //written by WarGodNT입니다 //Written by ImaCheata.) 또한 많은 사람들이 svUID가 그들을 망칠 수 있다는 것을 알고있을 것 같지도 않습니다. 그들 중 몇몇이 그렇게 똑똑하더라도; 대부분의 클래스가 속임수를 쓰면 몇몇은 잡힐 것이 거의 확실합니다. 최소한 교사가 자신의 과정을 풀도록 설득하기에 충분해야합니다.
Dan Is Fiddling By Firelight

3
@WilQu : 다른 사람의 이름이나 개인 키로 자신의 코드에 서명하지 않겠습니까?
분석 재개 모니카

35

이것은 같은 아파트에 살았던 한 쌍의 제자들에게 일어났습니다. 하나는 책상 서랍에 남겨진 디스크에서 소스 코드를 훔쳤습니다.

도둑은 훔친 출처를 약간 수정하여 분명하지 않게했습니다. 어쨌든 코드의 유사성을 발견하고 편집기에서 소스를 조사했습니다. 일부 줄에는 끝에 추가 공백이 있습니다. 각 학생의 소스에는 동일한 수의 추가 공간이 있습니다.

이를 악용하여 정보를 표시하지 않고 인코딩 할 수 있습니다. 이니셜이나 학생 ID를 공백으로 일부 줄 끝에 인코딩 할 수 있습니다.

도둑은 보이는 코드를 외관상으로 변경할 가능성이 있지만 보이지 않는 문자를 놓칠 수 있습니다.

편집하다:

이것에 대해 좀 더 생각해 보면 공백과 탭을 모스 부호 dits와 dah로 사용하고 여러 줄 끝에 이름을 넣을 수 있습니다. 도둑은 신분증을 훼손하지 않고 일부 줄을 제거, 순서 변경 또는 다시 입력 할 수 있습니다.

편집 2 :

"공백 스테 가노 그래피"는 공백으로 메시지를 숨기는 용어입니다. 인터넷 검색을 통해 Morse 코드 대신 Huffman 인코딩을 사용하여 90 년대로 거슬러 올라가는 오픈 소스 구현을 보여줍니다 .


2
천만에요 질문 주셔서 감사합니다. 모스 부호 간격을 생각할 기회를주었습니다.
Andy Thomas

1
모든 Java IDE는 보이지 않는 모든 문자를 제거하는 코드를 포맷 할 수 있습니다. ;-) 여전히 모스 코드 아이디어는 좋습니다. :-)
Prakash K

5
확장자 : 문자열 리터럴에서 일부 공백을 공백처럼 보이는 문자로 바꿉니다. ASCII의 # 255 문자 또는 유니 코드의 "unwrappable blank"와 같습니다. 대부분의 초보자는 그 차이를 알아 차리지 못하며 누가 (아마도!) 귀하의 출처를 훔쳤는 지 표시 할 수 있습니다.
TheBlastOne 2013-04-17

@PrakashK-예,이 조치에 대응할 것입니다. 측정 값 조합이 가장 좋습니다.
Andy Thomas

@TheBlastOne-좋은 생각입니다. 그 자체로는 당신을 식별하지 못하지만 도둑이 개량해도 잃어 버리지는 않습니다.
Andy Thomas

19

IT 관리 문제인 것 같습니다. 각 학생은 다른 학생이 액세스 할 수없는 자체 업로드 영역이 있어야합니다.

교사는 각 학생의 업로드 폴더에 액세스 할 수있는 상위 레벨입니다. 이것이 가능하지 않은 경우 가장 간단한 솔루션이므로 @exabrial 대답으로 이동하십시오.


9

당신이 할 수있는 가장 좋은 방법은 단지 비밀번호로 소스 코드를 압축하고 그 비밀번호를 교사에게 이메일로 보내는 것입니다.

문제 해결됨.


2
간단한 솔루션에 +1. 과도하게 설계하지 마십시오. 하지만 먼저 그가 괜찮은지 교수에게 확인하십시오.
Eduardo

6

git 과 같은 분산 형 (= 독립형) 버전 제어 시스템을 사용합니다 . 너무 유용 할 수 있습니다.

이름과 날짜가있는 버전 기록이 충분히 설득력이있을 수 있습니다.


2
그러나 OP는 그의 출처가 그에 의해 만들어 졌다는 것을 증명하지 못합니다. 그는 학교 친구들이 자신의 출처를 자신의 출처로 사용한다는 것을 증명하는 데 어려움을 겪습니다.
TheBlastOne 2013-04-17

2
분산 VCS는 매우 복잡합니다. 저자가 필요로하는 모든 것은 콘텐츠 및 / 또는 복사의 독창성을 증명하는 것입니다. 이는 제출물에 타임 스탬프를 찍고 제출자를 식별하며 학생이 제출물을 삭제할 수 없도록하는 파일 제출 메커니즘을 사용하여 수행 할 수 있습니다. 이것은 FTP 또는 웹 서버와 같은 간단한 작업으로 수행 할 수 있습니다.
Nick P

1
커밋 로그를 스캔하고 기록은 같지만 사용자가 다른 새 저장소를 다시 만드는 스크립트를 작성하는 것은 매우 쉽습니다.
mikerobi 2011

@mikerobi을 git filter-branch위해 지어진 그런 미친 것들, 그게 쉽지 않을한다
Izkata

@Izkata, 개정 내역을 변경할 가능성을 고려하지 않았습니다. 나는 첫 번째 개정판을 확인하고 다른 저장소에 커밋 한 다음 두 번째 개정판을 확인하고 새 저장소가 커밋하고 반복하는 스크립트를 생각하고있었습니다. 하나의 VCS에서 다른 작업으로 변환하는 일부 도구와 유사합니다.
mikerobi

3

무엇을 훔쳤습니까?

  • 소스? 임의의 문자열을 넣을 수 있지만 변경할 수 있습니다. 당신 만이 알고있는 특별한 행동을 추가 할 수도 있습니다 (특별한 키를 누르면 색상 행이 바뀝니다). 그런 다음 교사에게 "다른 사람들이이 특별한 콤보를 알고 있습니까?"라고 요청할 수 있습니다. 가장 좋은 방법은 5 분 동안 활동 한 후에도 쓸모없는 빈 파일이 아카이브에 없으면 프로그램을 중단하는 것입니다. 학교 동료는이 시간을 기다리기에는 너무 게으르게됩니다.

  • 바이너리? 각 .class의 체크섬을 비교하는 것만으로도 충분합니다 (학교 동료가 수업 파일을 다시 작성하기에는 너무 게으르다)


2

마지막 순간에 솔루션을 게시하십시오. 이것은 누구에게도 그것을 복사 할 시간을주지 않을 것입니다.

또한 관리자에게 피드백을 보내 학생이 다른 학생 과제를 볼 수 없도록합니다.


1

암호 암호화를 사용하여 파일을 .zip으로 업로드하면 누구나 .zip 파일을 다운로드하여 암호를 해독 할 수 있으며, 치트 도둑이 큰 경우 CPU에서 백만 개의 쿼리를 실행하도록 할 수 있습니다. 불행히도 일부는 수행하기 쉽습니다.

다른 학생이 공유 서버에서 소스를 볼 수 있습니다. 선생님은 업로드 할 자신의 비밀번호 암호화 디렉토리를 제공해야합니다. 이는 하위 도메인을 추가하는 것만으로도 쉽게 수행 할 수 있습니다. 그러나 교사는 파일을 자신의 서버에 업로드하여 파일에 액세스하도록 허용 할 수 있습니다.

또한 document.write ( 'This page was written by xxxxx')를 갖도록 스크립트를 난독 화하여 작업을 복사 한 사람이 먼저 해독하지 않는 한 크레딧을 제거 할 수 없도록 할 수 있습니다. 그러나 실제 대답은 학교가 각 학생에게 비밀번호로 보호 된 디렉토리를 제공해야한다는 것입니다.


0

제 경우에는 선생님들이 더 나은 접근 방식을 사용했습니다. 그들이 제공 한 질문은 등록 번호와 관련이 있습니다. 전의:

기능 / 이론에 대한 입력은 등록 번호이며 각 학생마다 다릅니다.

따라서 솔루션에 대한 답변이나 접근 방식이 학생마다 다르기 때문에 모든 학생들이 스스로 숙제를하거나 최소한 자신의 등록으로 접근 방식을 해킹하는 방법을 알아야합니다. Lession을 배우는 것보다 어려울 수 있습니다;)].

Hope your lecturer will read this thread before his next tutorial :D
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.