리눅스


HTTPS의 통신이 안전한 이유, 동작원리

간단한 네트워크 통신 네트워크 통신은 정말 간단한 방식으로 동작한다. 클라이언트에서 "DATA" 라고 글자를 보내면 이 글자 그대로 서버는 받게 된다. 물론 서버의 주소와 데이터의 크기는 얼마인지 하는 추가정보적인 내용이 더 필요하지만, 이 "DATA"라는 글자는 네트워크 중간에서 그냥 "DATA"라고 보이게 된다. 아주 당연한 이야기다. 아무런 보안작업을 하지 않으면 아이디와 비밀번호, 신용카드번호같이 민감한 정보가 네트워크상에서 떠돌아 다니게 되고 이를 중간에서 가로채는 것은 아주 쉬운일이다. 이 날라다니는 내용을 암호화할 필요가 있다. 알아야할 보안 알고리즘 HTTPS는 4가지의 알고리즘을 알아야 한다. 수학적인 문제는 수학자들이 증명까지 해놓았기 때

Access Token과 Refresh Token - 이건 모야? - PHP

목차 JWT 토큰 이해하기- PHP 커스텀 JWT 토큰 - PHP Access Token과 Refresh Token - 이건 모야? - PHP 뭐하는 건가? 두가지의 주된 목적이 있다. 하나는 사용자의 편의성을 위한 것이고, 또 하나는 토큰한개만으로는 보안상 문제가 발생할 수 있기 때문이다. 토큰이 탈취된 경우 수많은 문제가 발생하게 된다. 따라서 탈취의 가능성을 줄이기위한 방법이다. 사실상 토큰이 탈취된 개념은 새션을 사용한 방식에서 세션키가 탈취된 것과 차이가 없다. SSL/TLS를 적용해야하는 이유기도 하며, 탈취를 막기위해 XSS공격을 막기위해 js코드를 치밀하게 만들 필요가 있는 이유다. 다른 스마트폰을 분실하는 경우 등의 물리적인

커스텀 JWT 토큰 - PHP

목차 JWT 토큰 이해하기- PHP 커스텀 JWT 토큰 - PHP Access Token과 Refresh Token - 이건 모야? - PHP 커스텀 토큰 기본적으로 JWT의 구조는 RFC7519에 정의해 놓았지만, xxxxx.yyyyyyy.zzzzzz 식으로 구조를 확정해 놓은 것은 아니다. 단지 서명을 빼내기 위해 "."이 한개 이상 있어야 되고, 보안 규칙에서 최소한 지켜야 할 것과, 권장되는 서명알고리즘을 기술할 뿐이다. 따라서 거의 마음대로 바꿔도 이 규칙에 위배되지는 않는다. 단지 관리하에 두지 않는 다른 서버와의 소통을 위해 이 방법을 사용할 뿐이다. 쉽게 말해서 다른 회사와 통신할 때 같은 규칙을 써야 하니까 이렇게 범용적인 형태를 이용하는

JWT 토큰 이해하기 - PHP

목차 JWT 토큰 이해하기- PHP 커스텀 JWT 토큰 - PHP Access Token과 Refresh Token - 이건 모야? - PHP 머리아프다. JWT라는 것을 구현하면서 정말 많은 생각을 해야 한다는 것을 알게 되었다. 단순해 보이지만 민감한 정보를 다루기 때문에 문제가 발생할 수 있는 상황에 다 대처할 수 있도록 구현하는 것은 쉽지 않았다. 필자가 이 작업을 하면서 평생동안 열손가락안에 들만큼 생각을 많이하게 만들었다. 아직도 머리가 아프다.ㅠㅠ 아~. JWT는 Json Web Token의 약자다. 어감이 좀 이상하지만 "잣"이라고 읽는다. 대체 왜 쓰는 건가? 세션을 이용하여 사용자를 파악 방식은 사용자가 페이지를 열거나 이동할 때마다 사용자정보를 DB서버 같은 곳[이후

복호화(PHP) : aes256 cbc openssl

이전에 포스트한 (C/C++)버전의 PHP버전이다. 하지만 이글을 바로 읽는 독자가 있을 수 있으니...  명령줄에서 다음과 같이 암호화 작업을 했다면 $ openssl enc -e -aes-256-cbc -in plain.txt -out encrypted.data -k "my_password" 이렇게 생성된 파일을 복호화하는 코드를 작성해 보자. 실제 위의 명령줄은 문제가 많지만, 처음 openssl을 접하는 사용자는 위의 명령을 통해 암호화작업을 많이 하게 될 것이다. 그러다 보니, 이 문제많은 방식에서 다른 방식으로 변경할 경우 일단 복호화작업을 해야 하니, 복호화 프로그래밍도 익힐 겸 복호화하는 코드를 생성해보자. 저장된 파일의 구조는 이전 포스트에서도 언급했듯이 다음의

복호화(C/C++) : aes256 cbc openssl

명령줄에서 다음과 같이 암호화 작업을 했다면 $ openssl enc -e -aes-256-cbc -in plain.txt -out encrypted.data -k "my_password" 이렇게 생성된 파일을 복호화하는 코드를 작성해 보자. 실제 위의 명령줄은 문제가 많지만, 처음 openssl을 접하는 사용자는 위의 명령을 통해 암호화작업을 많이 하게 될 것이다. 그러다 보니, 이 문제많은 방식에서 다른 방식으로 변경할 경우 일단 복호화작업을 해야 하니, 복호화 프로그래밍도 익힐 겸 복호화하는 코드를 생성해보자. 저장된 파일의 구조는 이전 포스트에서도 언급했듯이 다음의 구조를 가진다. 검은색 부분에 "Salt__"(8bytes)가 있으며, 이어서 실제 Salt값(노란색)이 8bytes가 따라온다

명령줄 : aes256 cbc openssl

openssl을 설치하고 암호화작업을 하기위해 인터넷을 뒤져보면 다음과 같이 암호화와 복호화를 할 수 있다. 암호화 하기 $ openssl enc -e -aes-256-cbc -in plain.txt -out encrypted.data 이 명령어를 이용하면 중간에 비밀번호를 묻게되는 데, 이 때, 비밀번호를 입력하면 암호화가 된 파일이 생성되게 된다. 복호화 하기

간단한 TGA파일 구조

가장 간단한 이미지 포맷이 필요한 상황이 발생했다. BMP포맷이 있지만, 어쩌다 TGA라는 포맷이 꽂혀서 좀 찾아 보기로 했다. 구조와 순서 TGA 구조와 순서 영역 크기 설명 1. Tga Header 18바이트 이미지의 주된 정보 2. Image ID 가변 Header의 첫 바이트[idLength]에 이 크기를 지정한다. 주로 사용하지 않는다. 3. ColorMap Data 가변 Palette 이미지를 사용할 경우만 존재하며, Palette Color값이 저장된다. 4. Pixel Data 가변 이미지 픽셀 정보를 담는다. 헤더의 정보에 따라 RLE압축으로 데이터를 넣

Exif 썸네일 추출 C코드

Jpeg 파일에서 썸네일을 추출해보기로 했다. 일단 기본이 되는 함수를 만들어 보자. // You must call exif_data_unref(return value ) if return value is not null. ExifData* JpegExif_GetThumbnail( const char* pszJpegFilePathName ) { ExifData* ret = nullptr; ExifLoader *loader = exif_loader_new(); ExifData *ed = nullptr; if( !loader ) { return nullptr; } exif_loader_write_file( loader, pszJpegFilePathName ); ed = exif_loader_get_data(lo

Image Rotation In C

Image Rotation In C 이미지를 회전시킬 일이 생겼다. 마음대로 회전되는 것은 필요가 없었고, 90, 180, 270도만 회전되는 것을 만들어야하는 상황이지만 그냥 다 만들기로 했다. 괜히 했다..ㅠㅠ 회전은 중학교때 배운 행렬의 회전공식을 이용하여 만들면 된다. 수학자들이 이미 너무 잘 풀어놓았으니 가져다 쓰기만 하면된다. [회전공식] x' = x cos(t) - y sin(t) y' = x sin(t) + y cos(t) 역함수도 있는 데, 회전을 거꾸로하면[-값으로 넣으면] 역함수의 결과와 같기 때문에 굳이 역함수를 쓸일은 없었다. 그래도 필요한 사람이 있을 수 있으니 넣어는 둔다. [회전의 역함수] x = x' cos(t) + y' sin(t) y = -x' sin(t) + y'

BiLinear Interpolation Of Image in C

구글을 뒤져서 다음의 코드를 찾아 냈다. https://gist.github.com/folkertdev/6b930c7a7856e36dcad0a72a03e66716 오랜동안 살아있는 링크로 알고 있지만, 혹시나 언제 지워질지 모르니 복사를 해 둔다. /// Sources: // // - https://chao-ji.github.io/jekyll/update/2018/07/19/BilinearResize.html void bilinear_interpolation(float *data, uint32_t input_width, uint32_t input_height, uint32_t output_width, uint32_t output_height, float *output) { float x_ratio, y_ra

fork() 사용법과 주의 사항

fork()함수는 자신의 프로세스를 복사해서 또 다른 자식프로세스를 만들어내는 것이다. 동작방식 fork()는 새로운 프로세스를 만든다. 새로운 프로세스를 만드는 것은 컴퓨터의 입장에서는 굉장히 느린 작업이다. Processing을 위한 context로 만들어야 하고, 메모리도 할당해야 하고, standard IO도 할당을 해야하는 등 시작을 위한 준비작업이 상당히 많다. 하지만 fork() 함수는 메모리를 스~윽 복사해서 context(*1)만 만들어 실행 시켜버리기 때문에 일일이 새로운 프로세스를 만드는 작업 중 일부만을 수행한다. 거의 thread를 만드는 것에 조금 더 추가되는 수준의 적은 부하만 발생하게 된다. linux가 발전하면서 처음에는 부하가 컸지만, 별별 테크닉들이 커널에 추가되면서 이 정

개 느린 복사 cp, 좀 빠르게 해보자.

리눅스에서 미친 듯이 사용하는 복사명령가 cp다. 너무 자주 쓰니 설명도 필요 없고, 리눅스를 쓰는 사람은 사용법을 달달외우기 까지 할 정도로 자주 쓰는 명령어다. 하지만... 이게 많은 갯수의 파일을 복사할 때는 속터진다. 드라이브의 구조상 SSD나 HDD나 어쩔 수 없는 부분이긴 하지만, 이 걸 피해 조금이라도 빠르게 복사하는 법을 한 외국인 칭구가 잘 정리를 해 놨다(에이~씨~ 복 받을 X, 옜다 복~). 링크는 맨 밑에 걸어 둘테니 영어가 편한 사람은 한번 가서 보기를 바란다.     빠른 복사 하기 다량의 파일을 복사할 때, 파일하나하나마다 접근시간(seek time)이 발생하게 된다. 파일이 저장된 위치로 가는 과정과 파일을 쓰기 위해 이동하는 과정에서 드는 시간이다. SSD

리눅스에서 SSD TRIM 살짝 공부 좀하고 설정하자

윈도우는 SSD를 인식하면 보통 특별한 설정을 하지 않은 경우 일정 주기마다 trim을 수행해 준다. 이 글만 보는 독자를 위해 좀 TRIM을 설명하면, 윈도우의 TRIM은 일정한 시간마다(보통 주단위) 전체 TRIM을 수행하고, 파일이 삭제되거나 내용이 지워지면 그 때 그 때 OS는 TRIM을 SSD로 보내게 된다. 솔직히 TRIM을 지속적으로 보내는 것도 리소스를 잡아 먹는 것이라 용량이 많이 남아있는 상태에서는 삭제시마다 전송하는 지속적인 TRIM은 그리 좋은 방법은 아니다. 어쨋든 이 작업을 OS와 SSD가 유기적으로 동작하도록 되어있다. 또한 OS는 TRIM을 SSD에 알릴 뿐 SSD가 실제 TRIM작업을 즉시 수행하는 것은 아니다. 심지어는 무시해버리기도 한다. 좀 더 정확한 개념은 필자의 다음글