2009-07-10 2 views
4

내 응용 프로그램은 하드 코딩 된 대칭 암호화 키을 사용해야합니다. 공개 키 저장 만이 유일한 완벽한 솔루션 일 것이라고 알고 있지만, 이는 협상 불가능합니다. 우리는 키를 에 저장하고 난독 화 된을 실행 파일을 분석하여 인식 할 수 없도록하고 가능한 한 짧은 시간 동안 메모리에 "저장"하도록합니다. 메모리 덤프를 검색 할 때 어려움이 커질 수 있습니다 명확한 문구. 나는 C++ 기능을 사용하는데 관심이있다. (일종의 scoped_key을 염두에 둔다.) 해결책은 휴대용 - Windows, Linux, MacOS -이어야하며 운영 체제 암호화 API를 이용할 수 없습니다.C++에서 암호 키를 숨기는 플랫폼 간 방법은 무엇입니까?

그런 시스템을 어떻게 설계 하시겠습니까? 고마워.

+0

이것은 실제로 할 수 없습니다. 여기서 어떤 문제를 해결하려고합니까? 어쩌면 그것을 달성하는 또 다른 방법이있을 것입니다. –

+0

비대칭 암호가 옵션이 아닌 이유를 설명 할 수 있다면 유용 할 수도 있습니다. – ykaganovich

+0

달성하려는 방법을 설명하는 것보다는 달성하고자하는 것을 설명하면 도움이 될 수도 있습니다. 공개 키 저장이 완벽한 솔루션이라고 주장했기 때문에 암호화 만 할 수있는 소프트웨어를 작성하거나 해독 할 수없는 소프트웨어를 작성하거나 무언가를 인증해야하는 소프트웨어를 작성하려고합니다. 더 자세한 내용이 없으면 유용한 설명을하기가 어렵습니다. – Accipitridae

답변

3

scoped_key은 단순히 스택에 KeyHolder 개체 일 수 있습니다. 생성자는 난독 화 된 버퍼를 사용하여 실제 키를 만들고 소멸자는 메모리를 0으로 만들고 메모리를 할당 해제합니다.

실제로 바이너리에서 키를 난독 화하는 방법은 시도 할 수있는 바보 같은 선택을 훨씬 더 큰 무작위 바이너리 블록에 넣고 오프셋과 크기를 기억하고 일부 짧은 임의 순서로 XOR하는 것이 좋습니다.

XORing 작업을 수행하면 메모리에 실제 키가있는 것을 실제로 피할 수 있습니다. 간단히 해독을 수정하여 키에서 바이트를 읽고 사용하기 전에 해당 값으로 XOR합니다.

* 무명을 통해 어떻게 어리석은 보안 여기에 면책 조항을 추가하는 것은 당신이 당신이 실행됩니다 어떤 플랫폼을 활용하지 않는 경우, 당신은 당신이 효과적으로 프로그램에서 대칭 암호화 키를 숨길 수 있음을 보증하지 않습니다 *

+1

면책 조항을 남겨 주셔서 감사합니다 - 나는 그것을 알고 있지만, 전혀 보호하지 못하는 것보다 낫습니다! 중요한 점은 이것이 완화 된 것임을 명심하는 것입니다. 숙련되고 결정적인 공격자는 모두 주위를 돌아 다니게됩니다. –

4

당신이 여기서하려는 것은 모두 모호한 보안입니다. 우리 중 한 사람이 아이디어를 생각해 내면, 그 아이디어조차 갖지 못할 것입니다.

John Skeet has a good article on this too.

임의 무언가를 내가 말할 수있는 것입니다.

0

입니다. 공격자가 디버거를 갖고 있다고 가정하면 해독 할 때 키를 사용해야하는 함수에 중단 점을 설정하는 방법을 결국 파악할 수 있습니다. 그럼 게임 끝났어.

-2

이미지에서 키를 숨길 수 있으므로 스테 가노 그래피를 보지 않겠습니까? 키를 찾을 수는 있지만 이미지가 명확한 패턴 (예 : 스페이스 이미지)을 따르지 않으면 더 어려울 수 있습니다. 이것은 크로스 플랫폼이 될 수 있습니다.

2

CloakwareArxan과 같이 Tamper Resistance 소프트웨어를 조사해야합니다.

TR은 싸지 않다 :이 프로그램의 약점이 사실 인 경우

3

당신이 생각 해 봤나? 다른 수표도 똑같이 적용되지만 라이센스 검사를하고 있다는 주장을 위해 가정 해 봅시다.아무리 잘 어떤 시점에서, 키를 숨겨, 얼마나 잘 당신의 알고리즘을 난독 어떻게 이런 식으로 뭔가 할 필요가 없음을,

if(!passesCheck()) { 
    exit(1); 
} 

당신의 잠재적 인 적수가 키를 찾을 수없는 암호를 해독, 파악 알고리즘 또는 다른 어떤 것. 테스트가 성공했는지를 결정하는 코드에서 위치를 찾은 다음 'jnz'명령어를 'jmp'로 바꾸어 무조건 테스트를 통과하면됩니다.

+0

고마워, 닉. 제가 직면하고있는 문제는 면허증이나 그 문제에 대한 다른 수표 중 하나가 아닙니다. 이 소프트웨어는 일부 데이터를 제공하고 암호화하여 서버로 다시 보냅니다. –

+0

여기에 목표가 무엇입니까? 사용자가 데이터를 읽지 못하게하려는 경우 데이터를 암호화하기 전에 검사 할 수 있으므로 문제가됩니다. 사용자가 메시지를 수정하지 못하도록하거나 자체 메시지를 생성하지 못하도록 막으려면 자체적으로 암호화가 무결성을 보장하지 않는다는 사실을 알고 있어야합니다. 공개 키 암호화 또는 HMAC가 필요합니다. –

관련 문제