안드로이드 인앱 결제 시스템에 대해서 가이드를 꾸역꾸역 따라가다 보면

결국 보안에 대해서 명시한 글을 만나게 됩니다.

(가이드 : http://developer.android.com/guide/google/play/billing/index.html)



아래 링크를 보시면 이런 글이 있습니다. 

http://developer.android.com/guide/google/play/billing/billing_best_practices.html



Protect your Google Play public key

To keep your public key safe from malicious users and hackers, do not embed it in any code as a literal string. Instead, construct the string at runtime from pieces or use bit manipulation (for example, XOR with some other string) to hide the actual key. The key itself is not secret information, but you do not want to make it easy for a hacker or malicious user to replace the public key with another key.



골자는 코드상에 리터럴 상수로 때려 박을경우 보안에 취약하니 서버를 통해서 내려 받거나 적어도 XOR로 퍼블릭키를 

숨겨서 사용하라..


훌륭한 가이드 아닙니까??? 보안에 취약하니깡 안내 문구도 명시해주고 말입니다. 

그래서 서버가 없는 제 경우에 이 퍼블릭 키를 숨기기 위해서 머리를 굴려봤습니다. 


C로 키를 한번 XOR해서 퍼블릭키와 XOR키를 숨겼습니다. 

그리고 사용시에 다시 복원해서 사용했습니다. 

하지만.... 별 의미 없습니다. 


왜냐하면 네이티브에서 바로 서버와 인증을 하는경우가 아니니 때문에 .. 

결국 java로 올려야 합니다. 


이게 무슨의미냐면 패킹된 어플을 뒤집어 까서 so 파일을 끄집어 낸다음에 

navtive 함수를 호출하면 결과를 볼 수 있으니 raw 폴더에 넣는거나 별반 차이 없습니다.

so파일을 호출해도 xor 된 값이라 java에서 복원하는 루틴을 알아내야 하겠지요 그래서 

이를 막기위해서 난독화 해서 어플 보는걸 방해 하면 되겠지요.. 하지만 완벽하지 않습니다.

 

그럼 어케 하느냐?

서버 사용해야 됩니다. 라는 결론밖에 생각이 안나는군요..ㅠㅠ


서버도 완벽하지 않겠지만.. 서버를 사용하면 퍼블릭키 변수가 바인딩 되는시점이

동적으로 최대한 느슨하게 되고 .. 패킹되어 있어 코드상에 노출되는 경우가 아니므로 이를 알아내려면 메모리를 덤프 뜨거나 

인터넷에서 내려오는 패킷정보를 후킹하거나 해야 하는데 이정도 하는놈들이 제 어플에 관심을 가지면 답이 없겠지요.

그래도 서버만한게 없어 보이네요 ㅋㅋ


한마디로 결국 서버..ㅠㅠ


지난번에도 글 올렸다 시피.. data/data  영역을 지울 수 있는 기능때문에 내장에 저장한 데이터가 보존될 수 없다고

해서 결국 서버 써야 된다고 말햇는데 ..


에전에 올린글..

http://www.androidpub.com/index.php?mid=devfree&page=6&document_srl=2213522



이 문제에 대해서 해결방안이나 좋은 생각있음 공유좀 부탁드려요 ~!!