2012-03-28 3 views
4

컴파일 된 응용 프로그램에서 찾을 수없는 방식으로 정적 암호를 저장하는 방법이 있습니까?C 소스 코드로 암호 암호화

필요한 두 가지 앱이 있습니다. 하나는 하드 코드 된 서버에만 연결하는 Windows 용 경량 FTP 클라이언트입니다. 다른 하나는 레벨 팩을 만들고 암호를 사용하여 저장하는 Objective C 게임입니다. 비밀번호 없이도 재생할 수 있지만 레벨 편집기에서는 열 수 없습니다. AES로 암호를 암호화하고 있지만 암호 해독을 위해 암호를 저장해야합니다.

지금까지 발견 한 유일한 아이디어는 암호를 하나의 문자열이 아닌 여러 문자열로 저장하는 것입니다. 이미 존재하는 문자열을 연결할 수 있기 때문에 게임에서 실제로 잘 작동 할 수 있습니다. 또는 긴 문자열로 저장하고 비밀 알고리즘을 사용하여 해당 문자열에서 암호를 가져올 수 있습니다. Windows 또는 C OS에서의 C 응용 프로그램을 디 컴파일하여 해당 알고리즘을 찾을 수 있습니까?

더 안전한 방법이 있습니까?

+0

기본 자원 검사에 대해 여전히 효과가있는 매우 단순한 방법은 숫자 (별도 저장)를 사용하여 암호 문자열 XOR을 저장하는 것입니다. 그런 다음 동일한 번호로 XOR하여 '해독'하십시오.이것은 디 컴파일이나 메모리 검사에 심각한 시도를하지 않을 것입니다. 특히 디코딩 된 문자열을 어느 정도의 시간 메모리에 저장하는 경우에 그렇습니다. – Bob

+3

http://en.wikipedia.org/wiki/Security_through_obscurity –

+0

그 (안보를 통한 보안)는 다른 문자열을 함께 넣거나 숫자를 XOR하는 것과 같은 일의 범주입니다. 맞습니까? 누군가가 활발히 하나를 찾고 있다면 암호처럼 소리가 나지 않는 단어를 사용한다고 생각합니다. 공격자가 자신의 시스템에 앱을 가지고있는 경우 모든 암호화가 손상 될 수있는 것처럼 보이기 때문에 나는 그 안에 너무 많은 생각을 넣고 싶지 않습니다. 기억을 너무 오래 동안 지키지 않는 것처럼 힌트를 많이 주셔서 고마워요. :) –

답변

-2

문자열 리터럴은 일반적으로 컴파일 된 C 소스에서도 바이너리 어딘가에 보관되고 저장됩니다.

당신이 할 수있는 일은 (적절히 구현 된) 웹 앱이 로그인 정보의 유효성을 검사하는 방법 (데이터베이스에 정보가 저장된 곳)과 비슷한 방법입니다. 암호를 해쉬 형식으로 저장하면됩니다. 종종이 방법은 MD5 + 소금 (here is a description and some sample PHP code)을 사용하는 것입니다. 당신이 할 수있는 것은 일반 텍스트 암호를 전송하거나 저장하는 대신 사용자 입력을 해시하고 저장된 해시 값에 대해 해시를 확인하는 것입니다. 일치하는 해시는 일치하는 비밀번호와 일치합니다.

편집

당신은 소스 코드를 수정할 수 없기 때문에 이것은, 비록 FTP 서버의 경우에 도움이되지 않습니다 ...

+0

답변 해 주셔서 감사합니다. 게임에서 암호는 작동하지만 FTP 응용 프로그램이나 레벨 코드는 작동하지 않습니다. 아직 언급하지 않았습니다. 내 나쁜 :) –

+0

아래로 Modded, 당신은 중 하나가 일반 텍스트 또는 암호 자체 금액 것입니다 암호로 해시를 사용하는 것입니다, 그리고 해싱은 편도입니다 ... –

+0

의미가 없습니다. 해싱은 여기서 도움이되지 않습니다. – CodesInChaos

2

할 수있는 OS X에서 Windows에서 C 애플리케이션 또는 코코아 애플 리케이션 단순히 알고리즘을 찾을 수 decompiled 수 있습니까?

예, 모든 사람이 만든 것은 다른 사람이 만들 수 있습니다. 절대은 민감한 데이터를 저장하기위한 가역 알고리즘을 사용합니다. - 은 리버스 엔지니어링됩니다. sidran32 쓴대로, 해시를 저장할 수 있지만, 클라이언트 도움이되지 않습니다

2

왜 디 컴파일의 고통을 통해 이동 - : 간단한

$strings <binary> 

이 그것을 할 것입니다 코드에 암호를 저장 절대로 작동하지 않을 것입니다 : 당신은 그들을 분할하고, 인코딩하고, 원하는 방식으로 그들을 암호화 할 수 있습니다 - 당신이 그들을 검증하기 위해 부품을 재 조립해야 할 시점이 있습니다. 바로 그 부분이 공격자가 디버거를 사용하는 곳입니다. 나는 비슷한 질문에 answer을 주었다.

유일하게 정말 안전한 방법은 암호 (또는 해당 이진 파일) 외부에 암호를 대역 외 정보로 저장하는 것입니다. 수백만 가지의 금이 간 Microsoft 또는 다른 제품이 입증됨에 따라 사용자가 염두에두고있는 이러한 종류의 DRM은 더 오랜 기간 동안 작동하지 않습니다.

+0

strings 명령에 대해 알고 있었지만 암호처럼 보이지 않는 암호를 선택하면 사람이 찾지 못할 것입니다. 디버거는 어떻게 작동합니까? 메모리를 즉시 풀어도 메모리에서 문자열을 찾을 수 있습니까? - 내가 말했듯이, 누군가가 정말로 레벨 코드를 찾고 싶다면 - 모든 암호화가 충분한 노력으로 깨질 수 있다는 것을 깨달았습니다. 나는 그저 귀찮은 가치가없는 솔루션을 찾고 있습니다. –

+0

@Alex'__asm ​​{int 3};을 삽입하면 모든 실행 파일의 디스 어셈블리를 호출 할 수 있고, 단순히 실행에 어떻게 든 침입하더라도 침입자는 프로그램의 어느 지점에서나 프로그램을 기본적으로 일시 중지 상태로 둘 수 있습니다 흐름. 문자열이 완료된 형태로 메모리에 존재한다면, 문자열을 빨리 해제하더라도 취약합니다. 그리고 그것이 릴리즈 되더라도 문자열은 프로그램 (또는 다른 프로그램)이 그 메모리 위치를 덮어 쓸 때까지 메모리에 남아있게됩니다.그것이 그가 말한 것입니다. –

+0

오, 알았어. 나는 몰랐다. 따라서 어떤 경우에도 암호는 10 초 이내에 발견 될 수 있습니다. - 파일 내용 (즉, 암호가 아닌 수준)을 사용하고 비밀 알고리즘을 사용하여 암호로 변환하는 데 도움이 될지 궁금합니다. –