카테고리 보관물: cs

cs

(오픈) 소스 코드에서 문자열 비밀 유지 찾지 못했습니다. 문자열 배열을

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

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

최신 정보

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



답변

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

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

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


답변

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

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

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

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

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

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

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

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

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

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


답변

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

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

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


답변

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


답변

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

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

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


답변

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

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

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

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

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

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


답변