기본 콘텐츠로 건너뛰기

1월, 2015의 게시물 표시

Google 서비스 계정 액세스토큰을 C/C++로 얻어내기

OAuth2에서 인증을 흔히 3단계 과정으로 얻어내는데, 이것을 "three-legged OAuth(줄여서 3LO)"라고 한다. 여기에서 반드시 사람이 OAuth를 제공하는 측 인증화면에 인증질을 하는게 보통이다. 그러나 서비스를 개발하면서 자동인증이 필요할 때가 있다. 서비스 감사 등의 부분에서 말이다. 이때 구글 OAuth2는 2LO를 지원한다. 단, 특수 계정이 필요하고, 지원 API가 한정적이다. (보안이슈 등) 참조:  Using OAuth 2.0 for Server to Server Applications 위 문서에서 다른 건 필요 없고, 개발 콘솔에서 <서비스 계정>을 생성하고, P12(PKCS#12) 파일을 다운로드 받아놓는 것에 주목하자. 문서에 보면 OAuth 주소 어찌고 저찌고... 요청응답 순서는 이렇지만, 그러지 말고 구글에서 미리 만들어놓은 클라이언트 라이브러리 가져다 써라 어쩌라 되어 있다. 좋다. 구글은 미리 예쁘게 Java, Python, PHP 등으로 클라이언트 라이브러리를 짜놨다. 하지만 C/C++은 없더라. 그래서 구글이 만들어놓은 PHP 클라이언트 라이브러리 소스 뜯어 보면서 액세스 토큰을 C/C++로 얻어내보았다. 사용라이브러리는 아래와 같다. OpenSSL >= 1.0.0 : http://openssl.org JsonCpp:  https://github.com/open-source-parsers/jsoncpp cURL:  http://curl.haxx.se 그러나 예제 소스에는 거의 의사코드 수준으로만... ㅋㅋㅋ Google OAuth2에 서비스 계정을 만드려면, JWT(Json Web Token, 발음 주의: 좃)이라는 포맷으로 요청을 해야한다. JWT 참조:  http://jwt.io/ (여기에서도 C/C++ 라이브러리는 찾아 볼 수가 없다) 영어 다시 해석하려면 어려우니까 미리 말을 남겨놔야겠다. ㅋㅋ...

EVP_DigestSign/Verify 예제

비대칭 알고리즘을 이용하여, 사인/검증 하는 API를 OpenSSL 1.0.0부터 쓸 수 있다. 문제는 아직 예쁜 예제가 없다는 것. 그래서 낑낑끙끙 하며 만들어 봤다. #include <openssl/rsa.h> #include <openssl/evp.h> #include <iostream> using namespace std; void testSignVerify(void) { EVP_PKEY* pkey(/* 이미 만들어놓은 키 */); char src[] = "Hello, world!"; unsigned char sign[1024] = {0x00}; size_t signlen(sizeof(sign)); do { EVP_MD_CTX md; EVP_MD_CTX_init(&md); if ( EVP_DigestSignInit(&md, nullptr, EVP_sha256(), nullptr, pkey) <= 0 ) { cerr << "EVP_DigestSignInit" << endl; break; } if ( EVP_DigestSignUpdate(&md, src, strlen(src)) <= 0 ) { cerr << "EVP_DigestSignUpdate" << endl; break; } if ( EVP_DigestSignFinal(&md, sign, &signlen) <= 0 ) { cerr << "EVP_DigestSignFinal" << endl; break; } cerr << "Sign: "; PWEnc::encodeHex(cerr, sign, signlen) << endl; EVP_MD...

설치한 패키지에서 RPM 추출하기

오래된 패키지를 관리할 저장소가 없어졌고, 기존 패키지로 다른 서버를 세팅해야할 일이 생겼다면 RPM의 리패키지 기능을 이용해보자. $ rpm -e --repackage [PACKAGE_NAME] 위와 같이 리패키지하면, /var/spool/repackage/ 에 생성한 RPM파일이 있다. :-)

GDB에서 긴 문자열 보기

GDB에서 문자열을 출력할 때, 너무 길면 적당히 "..."으로 줄여서 보여준다. 평소에는 크게 이슈가 없지만, 만일 그 내용이 필요할 때는 아래와 같이 "set"을 이용할 수 있다. set print elements 0 또한 중간에 <repeats n times>로 중복 문자열을 줄여주는 것은 아래와 같이 풀 수 있다. set print repeats 0 참조: https://sourceware.org/gdb/current/onlinedocs/gdb/Print-Settings.html#Print-Settings 자주 쓴다면, ~/.gdbinit 스크립트에 포함하자.