(오픈) 소스 코드에서 문자열 비밀 유지


50

Android 용 앱 개발을 마치고 GPL로 게시하려고합니다. 오픈 소스가되기를 원합니다. 그러나 응용 프로그램 (게임)의 특성은 수수께끼를 요구하고 문자열 리소스에 답변이 코딩되어 있다는 것입니다. 답변을 게시 할 수 없습니다! 암호를 안전하게 저장하라는 메시지를 받았지만 적절한 것을 찾지 못했습니다.

문자열 배열을 숨기거나 암호화하거나 숨기면 소스 코드를 게시 할 수 있습니까? 온라인 데이터베이스에서 답을 읽은 것일 수도 있습니다.

최신 정보

아래 Yuval Filmus의 솔루션이 효과가있었습니다. 처음 읽을 때 어떻게해야할지 잘 모르겠습니다. 두 번째 옵션 인 해시 솔루션을 소스에 저장하고 사용자가 추측 할 때마다 해시를 계산하는 몇 가지 솔루션을 찾았습니다. 자바 스크립트 에서이 작업을 수행하려면 http://code.google.com/p/crypto-js/에 crypto-js 라이브러리가 있습니다 . Android의 경우 MessageDigest 기능을 사용하십시오 . 이를 수행 하는 HashPass 라는 응용 프로그램 (fdroid / github) 이 있습니다.


11
나는 이것이 어떻게 주제에 관한 것인지 궁금합니다. 어떤 경우에도 정보 보안 에 더 적합 할 수 있습니다 .
Raphael

2
@YuvalFilmus "핫 질문"투표에 속지 마십시오. 그러나 지적했다.
Raphael

4
여기서 누락 된 중요한 세부 사항은 다음과 같습니다. 사용자 답변 만 확인 하시겠습니까, 아니면 정답도 인쇄 하시겠습니까? 그리고, 당신은 어리 석음이 필요합니까, 아니면 명확하고 제한된 정답 세트가 있습니까?
hyde

4
모든 답변은 어떤 문제를 해결하고자하는지 묻습니다. 답변을 게시 할 수 없습니까?
Rhymoid

1
이 문자열로 코드에서 무엇을 할 수 있습니까? 그것들을 해독 할 수 있어야합니까? 아니면 문자열을 충분히 비교할 수 있습니까?
David Schwartz

답변:


83

해결하려는 문제에 따라 두 가지 이상의 옵션이 있습니다.

코드의 무고한 독자가 실수로 답변을 얻지 못하게하거나 사용자가 유혹하지 않도록 조금 어렵게 만들고 싶다면 솔루션을 암호화하고 키를 코드의 일부로 저장할 수 있습니다. 약간의 계산 결과 (더 어렵게 만들기 위해).

당신이 할 경우 방지 대답을 검색하는 사용자가, 당신은 일방향 함수를 사용하거나 컴퓨터 전문 용어, A의 수 해시 함수 . 답변의 해시를 저장하면 먼저 답변 찾지 않고도 답변을 추론하지 않고도 답변이 올바른지 테스트 할 수 있습니다 . 이 문제에 대한 해결책이 있지만 정답에 가까운 답변을 확인하기가 더 어렵다는 단점 이 있습니다.


9
내가 추가해야 할 한 가지는 더 많은 보안이 필요하면 각 답변에 다른 소금을 뿌려야한다는 것입니다. 이렇게하면 모든 답변에 대한 사전 공격이 한 번에 방지됩니다. "실제"암호 사람들이 어떻게 하는지를보고 싶다면 OpenPGP의 String-to-Key 시스템을 살펴보십시오 .
가명

1
코드에 해시를 유지하면 모든 정보가 정적이고 소금 / 다른 정보도 쉽게 사용할 수 있습니다. 결과적으로 응답 공간이 32 비트 정수 값의 전체 범위와 같이 충분히 큰 경우 합리적이라고 생각합니다. 그렇지 않으면 (다중 선택 질문의 경우) 레인보우 테이블 이 신속하게 정답을 줄 것입니다.
Alexei Levenkov

3
Alexei가 지적했듯이 가능한 입력이 작은 공간에 걸쳐 있으면 코드에 답변을 저장하면 결정된 공격자가 열 수 있습니다. 대부분의 수수께끼는 상태 공간이 약간 작을 것입니다. 단어 또는 상대적으로 작은 숫자 중 하나입니다. 무고한 실수를 피하기 위해 해시 또는 암호화 할 수 있지만 누군가가 실제로 원하는 답변을 얻지 못하게 막을 수는 없습니다. (또한 그들은 이미 수수께끼를 해결 한 사람에게 물어볼 수 있습니다!)
Chris Hayes

4
Chris가 언급 한 내용에 대응하기 위해 매우 느린 해싱 프로세스를 선택할 수 있습니다 (100ms 소요). 이것은 여전히 ​​사용자의 관점에서 매우 빠르지 만 열거를 훨씬 어렵게 만듭니다.
Yuval Filmus

12
@YuvalFilmus 다시, 어느 정도. 수수께끼가 "얀, 조, 제인은 범죄자였습니까?" 해시가 1 분 정도 걸리더라도 열거하기가 매우 쉬울 것입니다. 전체 게임이이 점을 염두에두고 작성되지 않고 모든 질문이 매우 개방적이라면 문제가 될 수 있습니다. 그러나 네, 귀하의 질문 상태 공간이 충분히 크다는 개방형 질문이라면 답변을 보호 할 수 있습니다.
Chris Hayes

28

당신은 세 가지 옵션이 있습니다 :

답변을 나머지 소스 코드와 별도로 유지하십시오

코드가 오픈 소스가되기를 원하지만 답변이 오픈 소스가되기를 원하지 않는 경우 질문과 답변 없이 응용 프로그램에 대한 코드를 오픈 소스 로 제공합니다. 질문과 답변은 별도의 비공개 소스 "플러그인"입니다. 또는 데이터 파일. Android 앱은이 두 가지를 하나의 앱으로 묶습니다.

소스 코드에 답을 넣으십시오

또는, 질문과 답변을 오픈 소스를 원하는 핵심 요소로 생각 하는 경우 다른 사람들이 질문을 읽고 수정할 수 있도록 소스 코드에 답을 넣어야 합니다 . 소스 코드를 이해하고 수정할 수 없도록 난독 화하는 것은 실제로 오픈 소스 코드의 원칙을 따르지 않습니다.

인터넷의 서버에 답을 넣으십시오

위의 두 가지 솔루션을 사용하면 앱을 다운로드 한 사람이 어느 경우 든 프로그램을 재생하지 않고도 답변을 찾을 수 있습니다. 프로그램이 추가 정보없이 답변을 식별 할 수있는 경우 답변을 난독 처리 / 암호화하는 방법에 관계없이 인간이 컴파일 된 앱을 검사 할 수 있습니다.

아무도 답변을 찾을 수 없도록 하려면 실제로 답변 을 알고 싶지 않을 때마다 답변을 제공하지 않고 앱에 웹 서비스 등을 호출 하지 않는 것이 유일한 방법입니다 . 앱은 사용자가 입력 한 답변을 보내야하며 웹 서비스는 답변이 정확한지 여부를 앱에 알려야합니다. 그렇게하면 사용자는 이미 정답을받은 후까지 답변이 무엇인지 알 수 없습니다 웹 서비스에 대한 무차별 강요 (감지 및 보호).

답변을 난독 처리하는 방법을 찾고 있다면 답변을 처음부터 공개 소스로 만들고 싶지 않다는 것을 제안하므로 첫 번째 옵션을 고려해야합니다.

사용자가 미리 답변을 찾을 수없는 것이 중요 하다면 세 번째 옵션이 유일한 선택이지만, 이것이 사용자를 방해하기 때문에 노력이 가치가있는 시나리오를 생각하는 데 어려움을 겪고 있습니다. 인터넷에 연결하지 않고 앱을 사용하지 마십시오.


8
Q & A는 플러그인 일 필요도없고 간단한 데이터 파일 일 수도 있습니다. 입력 데이터 파일은 라이센스가 부여 된 소프트웨어의 일부로 포함되어 있지 않아도되며 별도의 라이센스로 보호받을 수 있습니다. 소스 코드와 함께 사용할 (다른) 샘플 데이터 파일을 제공하는 한 해당 소스에서 컴파일 된 소스 또는 프로그램의 무료 사용을 방해하지 않으므로 GPL을 위반해서는 안됩니다.
Doktor J

답변이 코드로 암호화 및 하드 코딩되거나 별도의 파일로 배포되는지 여부에 관계없이 자신의 문제를 실제로 해결할 수 있는지 확실하지 않습니다. 코드는 여전히 답변을 해독 할 수 있어야하므로 앱을 다운로드하는 사람은 무엇을 할 수 있습니다 소스 코드가 답을 얻습니다. (다른 답변에서 제안한대로 해시되지 않는 한)
Johnny

1
답변을 확인하는 것이 목표이며 답변을 표시하지 않아도되는 경우 단방향 해시를 사용하여 비밀번호와 동일한 방식으로 수행 할 수 있습니다.
JamesRyan

@Justin, 답변 주셔서 감사합니다. 오픈 소스를 구성하는지 여부에 대한 귀하의 의견은 흥미 롭습니다. 답을 숨기는 것이 소스 코드를 난독 화하기 위해 또는 응용 프로그램이 작동하는 방식이 아니라 도전의 방해를 보존하기위한 것이라고 생각합니다. 암호화는 사용자가 추측 할 때 ( '이것입니까?') 수수께끼를 배포 할 수있는 훌륭한 방법입니다.
Nevermore

4

객체가 소스 코드를 읽지 않아도 문자열을 가리고 열 수 있도록하여 다른 사람들이 쉽게 변경할 수 있도록하는 경우 (예 : 소스를 텍스트 어드벤처에 게시하고 설명적인 텍스트를 표시하지 않으려는 경우) 스포일러를 구성하고 rot13과 같은 가역적 인 것을 사용하십시오.

실제로, 모든 번역 파일을 rot13하고 즉시 다시 뒤집을 수 있습니다.

그것은 열린 정신을 유지하고 있습니다. 임의의 "매직"해시는 실제로 프로그래머에게 친숙하지 않습니다.


4
우리 사이의 많은 지오 캐싱 사람들은 rot13을 거의 원본만큼 유창하게 읽습니다.
yo '

4

오픈 소스는 소스 코드가 게임 데이터가 아닌 공개되고 이용 가능해야합니다. 따라서 데이터를 다른 파일에 쉽게 넣고 해당 파일을 게시 할 수 없습니다. 파일을 일시적으로 읽지 못하게하려면 암호화를 추가하십시오. 응용 프로그램에 강력한 암호화가 필요한지 의심됩니다.


1
어떤 의미에서 게임 데이터를 "게시"할 수 없습니까? 게임은 해당 데이터에 액세스 할 수 있어야하므로 게임 사본이있는 사람은 누구나 데이터 사본을 갖습니다. 그것은 출판과 거의 같은 것입니다 : 공개하기.
David Richerby

1
@DavidRicherby 게시하고 싶은 내용에 따라 다릅니다. 많은 유사한 게임을 만드는 데 사용할 수있는 게임이나 엔진? 사람들이 게임을 조작하고 보안 허점을 검사하거나 구성 요소를 재사용 할 수 있습니까? 인터페이스가 "Q & A + program = game 인 CSV"와 같이 단순하다면 CSV가 아닌 프로그램 만 게시 할 수 있다고 생각합니다.
Raphael

1
@Raphael 그러나 실행 파일과 일반 텍스트 데이터 파일로 구성된 게임을 배포한다고해서 답을 비밀로 만들 수는 없습니다. 데이터 파일의 암호화 된 버전을 제안하려는 경우 모든 사람들이 이것이 모호한 보안이라는 사실을 이해하는 한 괜찮습니다 (키는 소스에 있음). 그러나 우리는 데이터 파일의 평문이 GPL의 의미에서 소스 코드를 구성하는지 여부에 대한 질문을 받고, 그 시점에서 질문은 컴퓨터 과학보다는 GPL의 해석의 문제가됩니다.
David Richerby

@DavidRicherby : 동의합니다. 여전히 IANAL이지만 수수께끼와 그 대답으로 구성된 데이터 파일이 프로그램에서 필수적으로 대체 할 수없는 부분으로 간주 될 것입니다. 특히 암호화되지 않은 샘플 데이터 파일을 포함하는 경우 소스 배포판은 소스 코드를 가진 사람이라면 누구나 자신 만의 맞춤형 데이터 파일을 만들어 프로그램과 함께 사용할 수 있음을 분명히하기 위해 필요한 경우 수정 및 암호화 지침과 함께 소스 배포판을 제공합니다.
Ilmari Karonen

4

사용자가 알지 못하게하려면 왜 답변을 GPL 소스 코드에 저장 하시겠습니까? 현재 알 수 없거나 쉽게 해독 할 수 있더라도 앞으로있을 수 있습니다.

앱에 저장하는 대신 외부 데이터베이스를 사용하십시오. 데이터베이스의 내용과 답변을 비교하는 소규모 웹 서비스를 만드십시오. 그런 다음 응용 프로그램이 확인해야 할 때마다 해당 웹 서비스를 호출하도록하십시오. 주요 문제는 인터넷 액세스가 필요하기 때문에 속도와 잠재적 인 사용자 기반이 다소 저하된다는 것입니다. 앱 라이센스는 웹 서비스가 아닌 앱 자체에만 적용해야합니다.

작은 데이터베이스에 답을 넣고 프로그램에 넣을 수도 있습니다. 내가 아는 한 GPL은 앱이 저장하는 데이터가 아닌 소스 코드에만 적용됩니다. 그래도 틀릴 수도 있습니다.


1
"내가 아는 한 GPL은 앱이 저장하는 데이터가 아닌 소스 코드에만 적용됩니다." GPL은 "이 라이센스에 따라 전체 사본을 소지 한 모든 사람에게 전체 저작물을 라이센스해야합니다"라고 말합니다. 따라서 데이터가 "전체 작업"의 일부인지 여부를 결정해야한다고 생각할 수도 있습니다. 그러나 실제로 모든 GPL의 제한 사항 (해당 사항 포함)은 라이센스 사용자에게만 적용됩니다. 라이센스 제공자는 GPL의 정신을 지키는 것도 좋지만 저작권 경찰의 방문에 대해 걱정할 필요는 없습니다.
피터 포드

1

원격 웹 서버에 데이터베이스를 저장하더라도 표시된 올바른 키 / 값 쌍을 모두 적어두면 데이터베이스를 계속 복제 할 수 있습니다. 일반적으로 말해서, 모바일 앱은 네트워크가 다운되어 있기 때문에 오류를 발생 시키거나 작동을 멈추려 고 시도하지 않아야합니다 (대기중인 메시징 사용 및 "가능한 경우 업데이트").

따라서 로컬 데이터베이스를 원하지만 완전히 해독하려는 아이디어가 마음에 들지 않으면 블룸 필터를 사용하여 네트워크와 대화하거나 로컬에서 큰 암호 해독 된 데이터베이스를 피할 수 있습니다. 메모리 공간이 매우 좁을 때 철자 검사기가 작동하는 방식입니다.

따라서 다음과 같이 질문 / 응답 쌍을 필터에 추가하면

해시 (NormalizeString (질문 [n])) + 해시 (NormalizeString (답변 [n]))

"버지니아의 캐피 톨? 리치몬드"가 세트에 있는지 묻는 경우 "확실히 아니요"또는 "거의 확실하게 예"라고 대답합니다. 오 탐지가 너무 많으면 데이터베이스를 더 크게 만드십시오.

사용자가 예상대로 정확하게 질문과 답변의 철자를 가정하면 작은 공간에 거대한 데이터베이스를 가질 수 있습니다. 데이터베이스를 작게 유지하면 업데이트가 무선 네트워크를 통해 전송되어야하므로 업데이트에 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.