이 프로젝트에 대한 기록을 시작하며
2022년 12월부터 2023년 2월까지 진행한 현장실습은 나에게 많은 것을 배우게 해주었다. 실습에서 실제 보안 개발 업무가 어떻게 이뤄지는지 어깨너머로 배울 수 있었고, 학교에선 배우지 못했던 프로젝트 관리, 배포 등에 대한 내용들도 익힐 수 있었다. 나에게 너무나 많은 것을 가르쳐주신 수석님께 다시 한번 감사의 말씀을 드리고 싶다. 정말 진심으로 가르쳐주신 덕분에 난 이 짧은 시간동안 많은 발전을 이룰 수 있게 되었다. 앞으로 내가 만든 크립토 라이브러리에 대한 기록을 시작하기 앞서, 이 프로젝트가 어떤 요소들을 담고 있는지 이 글에서 간단하게 소개하고자 한다. 깃허브에 간단하게 readme 도 적어놨으니 보면 이 프로젝트를 이해하는데 도움이 될 것 같다.
깃허브 링크 :
https://github.com/0xGh-st/I_CRYPTO.git
GitHub - 0xGh-st/I_CRYPTO
Contribute to 0xGh-st/I_CRYPTO development by creating an account on GitHub.
github.com
1. 프로젝트와 관련된 전반적인 지식
이번 프로젝트를 진행하면서, 실제 업무에서 어떤 식으로 프로젝트를 관리 및 배포하는지에 대해 배울 수 있게 되었다. 코드적인 측면에서 고객이 좀 더 이용하기 쉽게 코딩하는 법, 또 외부로 배포할 때 숨겨야 되는 코드와 그렇지 않은 코드를 가려내는 법, 그렇다면 숨기고 싶은 코드가 있다면 어떻게 코드를 감출 수 있는지 등 정말 실제 업무에서만 배울 수 있는 여러 기술들을 익힐 수 있었다. 또 고객에게 배포할 때, 고객이 쉽게 프로그램을 이용할 수 있도록 샘플 코드를 제공하는 것과, Doxygen을 이용하여 코드를 문서화하는 것까지 해보았다. 또 이를 진행하며 전반적인 깃 사용법을 익힐 수 있었다. 여기에 더 편의를 제공하고자 프로그램 빌드 및 테스트를 용이하게 하기 위한 Makefile을 작성하는 법도 익힐 수 있었다. 여기서 또 고객에게 배포할 부분만 패키징 하는 makefile까지 작성하여 실제 내가 패키징한 프로그램을 상대방이 잘 사용하는지도 테스트 해보기도 했다. 추가적으로 so, dll같은 라이브러리를 직접 만들어보고 이들을 서로 합쳐 빌드하는 것도 직접 해보았다. 실제 필드에서 프로젝트를 진행하고 고객에게 배포할때까지 전반적으로 어떤식으로 일이 진행되는지 익힐 수 있는 매우 귀중한 경험이었다.
2. 보안 관련 지식
해킹도 공부하고 학교에서 보안관련된 수업을 많이 수강하면서 기본적인 보안지식은 갖추고 있었으나, 이론적으로만 알던 보안지식이 실제 어떤식으로 이용되는지, 어떻게 코드로써 구현되는지 익힐 수 있었고, 기존에 알고 있던 지식에서 더 깊이있고 넓은 지식들을 배울 수 있었다. 이 프로젝트에선 CBC와 CTR모드를 이용한 암복호화 라이브러리를 구현하였다. 또 실제 여러 크립토 라이브러리에서 제공하는 암복호화 함수들을 직접 구현하였다. 회사에서는 회사 라이브러리 함수들을 이용하여 구현하였고, 이후에는 회사 라이브러리가 아닌 openssl을 이용하여 라이브러리를 구현하였다. 대칭키를 나눠갖기 위해 공개키로 암호화하고 인증서 개념까지 모두 포함한 TLS방식에 대한 지식을 얻을 수 있었고 이를 모방하여 안전한 소켓 통신 프로그램을 만들어보았다.(이 프로젝트 자체에선 인증서는 다루진 않는다.) 또 OTP를 구현하며 실제 OTP가 어떤식으로 서로 인증이 되는지에 대해 익힐 수 있었다. 전반적으로 지금까지 배웠던 보안 이론이 실무에서 어떤 식으로 구현 및 사용되고 보안 프로그램들이 어떻게 만들어져 있는지 배울 수 있었다.
3. 소켓과 멀티쓰레드 관련
소켓에서 TLS방식을 모방하여 안전한 통신을 할 수 있는 프로그램을 만들면서, 멀티쓰레드 기반의 프로그램을 작성하는 법, 또 기존에 잘 해보지 못했던 소켓 프로그래밍에 대한 지식들을 익힐 수 있었다. 멀티쓰레드 기반 프로그램의 실행 흐름을 파악할 수 있었고, 쓰레드 릭이 나지 않기 위해서는 어떤 식으로 해야하는지, 또 Thread Safety한 코드를 작성하려면 어떻게 해야하는지 등 많은 지식을 배울 수 있었다. 또 소켓 통신을 할 때 어떤 관례같은 것들이 있고, 데이터를 제대로 받으려면 어떻게 해야하는지, 또 제대로 데이터가 전송되지 않는다면 어떻게 해결 및 처리해야하는지에 대해 익힐 수 있었다.
4. 기타
이렇게 프로젝트를 진행하면서 당연히 리눅스 자체에 대한 익숙함도 올라갔다. 생 vim환경에서의 개발도 곧 잘 할 수 있을 정도로 리눅스와 친해진 것 같다. 또 C로 만든 이 라이브러리를 jni를 이용하여 자바에서도 사용할 수 있는 라이브러리를 만들어보기도 하였다. jni 를 이용하면서 c로 만든 코드를 자바도 지원할 수 있게 만들 수 있는 능력을 키울 수 있게 되었다. 현재 프로젝트에 jni에 관련 코드가 있는데 이 코드는 아직 회사라이브러리를 그대로 쓴 것을 수정하지 않아 동작하지 않지만 추후 수정하여 될 수 있게 하려고 생각 중이다. 간단하게 이 프로젝트를 하며 배운 지식들에 대해, 이 프로젝트가 담고 있는 내용에 대해 작성하였는데, 간략하게 썼음에도 벌써 정말 많은 것을 배웠구나 스스로 느끼게 되는 것 같다. 두 달 이라는 짧은 기간 동안 많은 것을 가르쳐주시려고 노력해주신 수석님께 정말 다시 한번 감사의 말씀을 드리면서 이 프로젝트에 대한 기록의 첫 시작을 이만 마치겠다.
'C > Crypto' 카테고리의 다른 글
Crypto Project : 1-5. 암복호화 init, update, final 구현 (0) | 2023.04.16 |
---|---|
Crypto Project : 1-4. C언어에서 멤버변수 접근을 막는 방법과 init, update, final의 개념 (0) | 2023.04.15 |
Crypto Project : 1-3. 암호화, 복호화 함수(enc, dec) (1) | 2023.04.14 |
Crypto Project : 1-2. 블록암호운용모드 ECB를 이용한 CBC, CTR 모드 구현 (0) | 2023.04.13 |
Crypto Project : 1-1. i_crypto library - 구조 및 문서화 예시 (0) | 2023.04.11 |