기본 콘텐츠로 건너뛰기

2018의 게시물 표시

데일 카네기 인간관계론 정리

완벽한 공부법 정리

8월 독서 계획

읽고 있는 책 : 일취월장 읽을 예정인 책 : 기획의 정석, 세계의 엘리트는 왜 이슈에 집중하는가, 맥킨지는 일하는 마인드가 다르다

Github의 새로운 미래

마이크로 소프트가 깃헙을 인수했다는 기사를 관심있게 보았다 .  인터넷에서는 부정적인 의견들이   많지만    나 는 마이크로 소프트와   깃헙이 만들어낼 새로운 즐거움과 편의성이  기대된다. https://blog.github.com/2018-06-04-github-microsoft/

AAAA

AAAA AAA 정보보호기술 AAA Authentication: 신뢰성 있는 인증 Authorization: 권한 검증 Accounting: 과금 기능 위 기능을 체계적으로 제공하는 정보보호기술

call-by-value_call-by-reference

call-by-value_call-by-reference Call By Value & Call By Reference 원론적으로 C 언어는 call by value만 지원한다. 단 pointer가 value로 가능하기 때문에 수동으로 저수준 reference 처리를 할 수 있다. C++ 언어에 와서야 call by value 외에 call by reference를 명시적으로 지원한다. (이는 C 언어에서 함수 포인터를 이용하여 OOP를 구현할 수 있지만 C언어가 OOP를 지원한다고 말하지 않듯이 C 언어는 call by value만 지원한다고 한다.) 참고 URL : KLDP 토론 글타래

Secure-Header

Secure-Header 보안 헤더 Content-Security-Policy 요약 설정된 URL의 Static Resource만 허용하게 하는 용도로 주로 XSS 공격 방지 목적으로 사용된다. Content 종류 script-src: JavaScript code. connect-src: XMLHttpRequest, WebSockets, and EventSource. font-src : fonts frame-src: frame urls img-src: Images media-src: audio & video object-src: Flash (and other plugins) style-src: CSS 예시 Content-Security-Policy: script-src ‘self’ https://apis.google.com X-Frame-Options 요약 <frame> , <iframe> , <object> 태그를 렌더링할지 막을지 결정하는 것으로 ClickJacking과 같은 공격을 무력화하기 위해 주로 사용된다. 사용 방법 X-Frame-Options: DENY (비 허용) X-Frame-Options: SAMEORIGIN (동일 origin에서만 허용) X-Frame-Options: ALLOW FROM http://some-domain.com (특정 origin에서만 허용) X-Content-Type-Options 요약 리소스 다운 시 해당 리소스의 MIMETYPE이 일치하지 않을 경우 차단하는 헤더로 MIME-Sniffing 공격 차단을 위해 주로 사용된다. 사용 방법 X-Content-Type-Options: nosniff Strict-Transport-Security 요약 HTTPS 통신으로 고정하여(이후 발생되는 HTTP 요청을 브라우저가 자동으로 HTPS로 요청) 중간자 공격을 차단하는 헤더이다. 사용

과제 2018.05.25

SSL Pinning 보안 헤더 call by value, call by reference DB 보안가이드 AAAA or AAAAA 아파치 설정 Include 파싱에 대처하는 서버 진단 스크립트 개발 역 직렬화 취약점 각종 서버 보안 가이드 ORM 관련 보안에 대한 정확한 기준 진단 사례 외우기

눈을 크게 뜨고 고개를 높이 들어라. 그리고 배워라.

'그렇게 까지 해야되니?' 라고 할때, 아직 나태하지 않음을 느꼈다. 하지만 그것 또한 '우물 안의 기준이었구나'라고 생각하니 허탈감이 몰려온다. 프로그램 설치 경로를 알려주지 않았다고 불평했던 일도, 포티파이 실행이 부담스러웠던 일도, 보안 가이드 작성을 단순하게 여겼던 일도 모두 부끄러워서 어찌할바를 모르겠다. 어떻게 준비해야 나도 그런 걸 알 수 있을까. 코세라나 들어가봐야겠다.

where-is-execute-file

where-is-execute-file 리눅스 진단 시 프로세스 실행 파일 찾기 /proc/<PID>/ 경로에 가면 심볼릭 링크로 해당 프로세스가 실행된 실제 파일 경로를 확인할 수 있다. 활용하자.

Docker-basic-concept

Docker-basic-concept 도커 1. 정의 컨테이너 기반 가상화 도구 2. 등장 배경 및 사용 목적 컨테이너 기술은 오래 전부터 존재했으나, 사용법이 어려워서 잘 활용되지 않았다. 도커는 컨테이너 기술을 쉽게 사용할 수 있는 간편한 인터페이스를 제공함으로써 도커 뿐만 아니라 컨테이너 기술 자체를 유행시키는 결과를 이끌어냈다. 그 결과 환경 설정의 복잡함을 도커를 이용하여 해결함으로써 많은 사랑을 받고 있다. 3. 특징 주로 사용되던 가상화 도구들(VMware, VirtualBox 등)은 인프라 시스템을 포함한 가상환경을 제공하는 것과는 달리 도커는 인프라 시스템을 제외한 컨테이너라는 개념의 가상환경을 제공한다. 이는 애플리케이션에 반드시 필요한 바이너리와 라이브러리만을 포함하고 있으며 호스트 PC와 인프라 시스템을 공유하는 환경으로 호스트 OS 위에 존재하는 격리된 공간으로 볼 수 있다. 4. 이미지와 컨테이너 이미지 : 서비스 운영에 필요한 요소들을 묶은 형태 컨테이너 : 이미지를 실행한 상태 도커는 하나의 이미지로 여러 개의 컨테이너를 만들 수 있다. 운영체제에 비유하면 이미지는 실행파일, 컨테이너는 프로세스로 이해할 수 있다. 5. Immutable Infrastructure 도커는 '한 번 설정한 운영 환경은 변경하지 않는다.'는 Immutable Infrastructure 패러다임에 충실한 도구로 서비스가 업데이트되면 운영 환경 자체를 변경하지 않고 사용 중이던 이미지를 폐기하고 이미지를 새로 생성하여 배포한다.

QEMU-Kernel-Debugging

QEMU-Kernel-Debugging Linux Kernel Debugging 패키지 설치 sudo apt-get install git gitk build-essential libncursesw5-dev g++-arm-linux-gnueabi qemu-system-arm -y sudo apt-get install ncurses-dev -y sudo apt-get install ctags cscope -y sudo apt-get -o Dpkg::Options::="--force-overwrite" install gdb-arm-none-eabi 커널 컴파일 git clone https://github.com/torvalds/linux.git cd linux make ARCH=arm versatile_defconfig make ARCH=arm menuconfig Kernel Features --> Use the ARM EABI to compile the kernel 적용 Kernel Hacking --> Compile-time checks and compiler option --> Compile the kernel with debug info 적용 make ARCH=arm CROSS_COMPILE=arm-linux-gnueabi- all 테스트 파일 생성 init.c # include <stdio.h> int main ( int argc , char * argv [ ] ) { printf ( "\n" ) ; printf ( "My ARM Init!!!\n" ) ; while ( 1 ) ; return 0 ; } arm-linux-gnueabi-gcc -static init.c -o init echo init | cpio -o --format=newc > in

CVE-2016-3672, CVE-2018-1000004

주목 받고 싶은 마음은 내려놓고 본질에 집중해라.

매체가 많아진 만큼 , 그래서 발언권을 얻기 쉬워진 만큼 내공을 쌓기가 힘들어졌다 . 단상에 서고 싶은 욕심에  채  익기도 전에 다듬어지지 않은 지식을 꺼내고 만다 . 그렇게 꺼낸 지식은 내 것도 아니고 원했던 영향력도 가질 수 없다. 주목 받고 싶은 마음은 내려놓는다면 화려한 기술보다는 본질을 이해하는 노력을 기울일 수 있고 그 때 내공이 쌓일 것이다.

Cryptocurrency

Cryptocurrency 블록체인 블록 : 무엇이든 기록할 수 있는 공간으로 (비트코인은 transzction 거래를 넣는다) 지문과 같은 고유의 식별 값을 가지고 있다. 블록 + 체인 : 블록은 추가 생성되면 이전 블록과 연결되어 이전 블록의 식별 값을 참고하여 자신의 식별 값을 생성하게 된다. 이와 같은 방식으로 추가된 블록 간의 연결성을 체인이라 한다. 이와 같이 블록체인은 정보를 저장하는 방법으로 의료기록과 같이 조작이 불가하게 관리하기 위한 데이터베이스이다. 따라서 저장은 가능하지만 삭제하는 것은 불가능한 데이터베이스( Append only )로 이해할 수 있다. 암호화폐 화폐 : 정부를 통해 공인된 거래수단으로 정부의 신뢰도에 따라 화폐의 가치도 결정된다. 암호 : 수학을 이용하여 메시지의 뜻을 감추는 기술로 감춘 정보를 복구하는 방법을 모르는 사람에게 정보를 노출되지 않게 한다. 암호화폐 : 수학에 대한 신뢰를 기반으로 한 화폐로 정부를 포함한 제 3자가 신뢰의 수단이 아니므로(과학기반 화폐) 베네수엘라와 같이 정부의 실패가 화폐에 영향을 미치는 일이 없는 장점이 있다. 화폐 유한함 채굴이 완료 되면 더 이상 늘어날 수 없다. (Ex. 비트코인, 금) 하지만 정부에서 발행하는 명목화폐의 경우 무한정 발행이 가능하며 이는 인플레이션(돈이 많아져 가치가 하락)을 초래할 수 있다. 교환 가능 내가 가진 화폐와 다른 사람이 가진 화폐(동일한 원화는 동일한 가치)를 교환 가능하며 이는 화폐가 오래되었다고 해서 더 높거나, 낮지 않다. 분할성 상품 거래 시 1000원을 500원으로 분할하여 교환할 수 있다. 내구성 시간이 오래되었다고해서 가치가 변질되면 안된다. (1년 후에도 10년 후에도 동일한 금) 양도 가능성 전달이 편리해야한다. 종이화폐와 암호화폐는 이에 충족하지만 금은 충족하지 못한다. 안정성 가치가 안정적이다. 비트코인은 이를 충족하지 못하므로 좋은 화폐가 아니다.

Vulnerability

Vulnerability 취약점 모든 어플리케이션에는 버그가 존재하며 개발자는 항상 버그와 함께 있다고 해도 과언이 아니다. 이러한 버그들 중 악용 가능한 버그들을 취약점(Vulnerability) 혹은 보안 버그라고 한다. 악용 사례 다른 사용자 개인 정보 무단 열람 웹 사이트 내용 무단 변경 악성 코드 배포 다른 사용자 권한 무단 도용 웹 사이트 서비스 불가 취약성이 있으면 안되는 이유 경제적 손실 이용자의 금전적 손실에 대한 보상 변상 및 위자료 비용 웹 사이트 서비스 불가로 인한 기회 비용 이미지 실추로 인한 매출 감소 법적인 요구 개인정보에 관한 법률 개정이 2011년 12월 29일 국회 본회의를 통과하여 2012년 2월 17일 공포 후 6개월이 경과한 8월 18일부터 시행되고 있다. 이 법안은 개인정보를 수집하고 저장하는 사업자는 개인정보를 취급하는 사업자로서 안전 조치에 대한 의무를 명시하고 있다. 이용자의 돌이킬 수없는 피해 일단 유출된 개인 정보를 막는 것은 불가능하므로 유출된 개인 정보로 인해 이용자가 피해를 입고 잇는 경우 원래 상태로 돌이키는 것은 불가능하다. 또한 금융 정보 유출로 인한 금전적 손실 발생시 보상은 가능할지라도 그에 따른 고통은 보상하기 힘드므로 돈을 통한 해결이 사실상 불가능하다고 볼 수 있다. 봇넷 구축에 가담 봇넷이란 Malware의 일종으로 외부의 명령을 받아 스팸 메일 전송 또는 DDoS 공격에 가담하는 등 좀비 PC들로 구성된 네트워크를 말한다. 공격자는 취약성이 있는 웹 사이트의 내용을 변경하여 이용자의 PC가 봇에 감염되어 공격자의 명령을 받아 자신도 모르는 사이에 공격에 가담되는 상태로 만든다. 취약성 발생의 원인 애플리케이션 버그 보안을 고려하지 않은 설정 애플리케이션 버그에는 SQL 인젝션이나 Cross Site Scripting과 같은 유명한 취약점이 포함되어 있다. 보안을 고려하지 않은 설정의 대표적인 예로는 디

Electronic certificate

Electronic certificate 전자 인증서 의의 공개 키 암호 방식이나 전자 서명에선 공개 키가 정말로 통신하고자 하는 상대인지 보안되지 않는다는 문제가 있다. 예를 들어 A가 B에게 공개 키를 보낼 때, X가 공개 키를 바꿔 전달해도 B는 눈치채지 못할 수 있다. 전자 인증서를 이용하면 공개 키 작성자가 누구인지를 보증할 수 있다. 동작 방식 A는 공개 키 PA와 비밀 키 SA 쌍을 가지고 있으며 공개 키 PA를 B에게 보내려고 한다. A는 먼저 인증 기관(CA : Certification Authority)에 공개 키 PA가 자신의 것임을 나타내는 인증서 발행을 의뢰한다. 인증 기관은 전자 서명을 관리하기 위한 조직으로 많은 인증 기관이 존재한다. 따라서 정부나 외부 기관을 통해 감사를 받은 신뢰할 수 있는 기관을 이용하는 것이 좋다. 인증 기관은 자신이 준비한 공개 키 PC와 비밀 키 SC를 보유하고 있다. A는 공개 키 PA와 메일 주소를 포함한 개인 정보를 준비해서 인증 기관에 보낸다. 인증 기관은 확인을 완료하면 인증 기관의 비밀 키 SC를 이용해서 A의 데이터로부터 전자 서명을 작성하고 전자 서명과 데이터를 하나의 파일로 만들어 A에게 보낸다. (이 파일이 A의 전자 인증서가 된다.) A는 공개 키 대신 전자 인증서를 B에게 보낸다. B는 전달 받은 인증서에 적힌 메일 주소가 A의 것인지 확인한다. B는 인증 기관의 공개 키를 취득한다. 인증서 내의 서명이 인증 기관의 것인지 검증한다. 인증서의 서명은 인증 기관의 공개 키 PC로만 검증할 수 있다. 즉, 검증 결과에 문제가 없다면 이 인증서는 인증 기관이 발행한 것이라는 것이 보장된다. 인증서가 인증 기관에서 발행된 것이고 A의 것임이 확인되었으면 인증서에서 A 공개 키 PA를 추출한다. (A의 공개 키 B에게 전달 완료) 검증 악의를 지닌 X가 A로 위장하여 B에게 공개 키 PX를 전달하려고 하지만 B는

Electronic signature

Electronic signature 전자 서명 전자 서명이란 전자 서명이란 메시지 인증 코드가 가지는 인증과 변조 검출 두가지 기능에 부인방지를 추가한 것이다. 메시지 인증 코드는 메시지에 MAC을 부여하므로 메시지 전송자가 키 소유자임을 증명하기 위한 구조이다. A가 메시지와 MAC 및 MAC 생성을 위해 사용한 키를 B에게 보낸다. B는 전달 받은 메시지와 키를 이용하여 MAC을 생성하고 A에게 전달 받은 MAC과 일치하는 지 확인한다. 이것으로 전송자가 A인 것과 메시지가 변조되지 않았음을 확인할 수 있다. 하지만 메시지 인증 코드는 공통 키를 사용하는 구조이므로 키를 가진 누구나가 메시지 전송자가 될 수 있다. 예를 들어 A가 B에게 메시지를 전송한 후에 해당 메시지는 B가 임의로 작성한 것이라 주장할 수 있다. 또한 공통 키를 사용하므로 A가 B 이외의 사람에게 메시지를 보내기 위해서는 다른 키를 준비해야하는 문제가 있다. 전자 서명 구조에서는 MAC이 아닌 전송자만 작성할 수 있는 전자 서명 이라는 데이터를 이용하여 메시지 작성자가 누구인지 식별할 수 있다. 이를 전자 서명이라 한다. 특징 부인 방지 Sig 라는 전자 서명은 A만 작성할 수 있다고 할 때, A가 전자 서명이 첨부된 메시지를 전송한 경우, 전송자가 A인 것이 보장된다. 메시지를 맏은 B는 전자 서명이 A의 것인지 확인할 수 있지만 동일한 전자 서명을 만들 수는 없다. 키 분배 문제 메시지 인증 코드와 달리 공통 키를 사용하지 않으므로 A는 동일 전자 서명을 사용해 불특정 다수와 통신할 수 있다. 전자 서명 작성 시 공개 키 암호 방식 순서를 응용한다. 동작 흐름 공개 키 암호 방식과 반대로 전자 서명은 비밀 키로 암호화하고 공개 키로 복호화하는 방식으로 비밀 키를 가진 A만 암호화할 수 있지만, 공개 키를 이용해서 누구나 복호화할 수 있는 암호문이 작성한다. 암호로서는 의미가 없지만, 이 암호문은 비밀 키를

MAC(message authentication code)

MAC(message authentication code) 메시지 인증 코드 메시지 인증 코드란 메시지 인증 코드는 인증과 변조 검출 두 가지 기능을 가지는 구조이다. 메시지 인증 코드가 필요한 상황을 생각해보자. A가 B에게서 상품을 사기 위해 상품번호 abc 를 전달하고자 한다. 이를 위해 A는 공통 키 암호 방식으로 테이터를 암호화한 후 안전한 방법으로 B에게 키를 보낸다. (키 교환은 공개 키 암호 방식 또는 디피 헬만과 같은 키 교환 프로토콜을 사용한다.) B는 전달 받은 키를 이용하여 암호문을 복호화 후 원 데이터인 abc 를 얻을 수 있다. 변조 가능성 A가 B에게 암호를 보낼 때, A가 B에게 전송하려고 한 암호문을 X가 중간에서 변조했다면 B는 변조 여부를 알아차리지 못하고 잘못된 상품 번호를 처리하게될 가능성이 있다. 메시지 인증 코드 - MAC(Message Authentication Code) 메시지 인증 코드(이하 MAC이라 칭한다.)를 사용하여 이러한 변조에 대응할 수 있다. MAC는 MAC 생성 키와 암호문을 특수한 연산을 통해서 생성한 값을 말한다. MAC 작성 방법 MAC 작성 방법에서는 HMAC, OMAC, CMAC 등이 있으며 HMAC이 주로 사용되고 있다. 동작 흐름 A는 MAC 생성을 위한 키를 만들고 안전한 방법으로 B에게 전달한다. A는 암호문과 MAC 생성 키를 이용하여 MAC을 만든다. A는 B에게 작성한 MAC과 암호문을 보낸다. B는 A와 마찬가지로 암호문과 MAC 생성 키를 사용해서 MAC을 작성한다. B는 직접 작성한 MAC과 A에게서 받은 MAC 값이 일치하는 지 비교하여 메시지 변조 여부를 확인한다. 만약 악의를 가진 X가 암호문을 변조했다면 B는 암호문으로부터 MAC을 생성 후 일치 여부를 확인하여 불일치 시 A에게서 전달 받은 암호문과 MAC을 파기하고 재전송을 요청한다. X는 MAC을 계산하기 위한 키를 가지고 있지 않아서

Diffie-Hellman

Diffie-Hellman 디피 헬만 키 교환 방법 디피 헬만 키 교환 법은 안전하게 키를 교환하기 위해 고안된 기법이다. 두 키를 합성하는 특수한 방법이 있다고 가정해보자. P 키와 S 키를 합성하여 P-S 키를 생성한다면 생성된 키는 다음 두 가지 특징을 가진다. P와 P-S 키를 이용하여 S 키 추출은 불가하다. 즉, 합성은 가능하지만 분해는 할 수 없다. 합성된 키로 또 다른 합성 키를 만들 수 있다. 동작 흐름 A가 P 키를 생성한다. (P 키는 공개되어도 무방하다.) A가 B에게 P 키를 전달한다. A와 B는 각각 비밀 키 SA와 SB를 생성한다. (이 때 SA와 SB는 제 3자에게 노출되어서는 안된다.) A는 P 키와 SA 키를 합성하여 P-SA 키를 생성한다. B는 P 키와 SB 키를 합성하여 P-SB 키를 생성한다. A가 B에게 P-SA 키를 전달한다. B가 A에게 P-SB 키를 전달한다. A는 비밀 키 SA와 B에게서 받은 P-SB 키를 합성하여 새로운 SA-P-SB를 생성한다. 동일하게 B도 비밀 키 SB와 P-SA 키를 합성하여 새로운 P-SA-SB를 생성한다. A와 B는 모두 P-SA-SB 키를 가지게 된다. 논리 인터넷으로 전송되는 P, P-SA, P-SB 키는 X가 훔쳐볼 수 있다. 하지만 X가 얻은 키로는 P-SA-SB를 합성할 수 없다. 또한 분해가 불가하므로 비밀 키 SA와 SB를 얻을 수 없다. 따라서 P-SA-SB 키를 만들 수 없으므로 이 키 교환 방식은 안전하다고 볼 수 있다.

hybrid cryptosystem

hybrid cryptosystem 하이브리드 암호 방식 하이브리드 암호 방식이란 공통 키의 키 분배 문제와 공개 키의 속도 문제를 해결하기 위해 데이터 암호화는 처리 속도가 빠른 공통 키 암호 방식으로 수행하고 키 관리는 공개 키 암호 방식을 이용하여 키 분배 문제를 해결한다. 동작 흐름 A가 B에게 데이터를 전달한다고 가정해보자. A는 처리 속도가 빠른 공통 키 암호 방식으로 데이터를 암호화한다. B는 공개 키와 비밀 키를 생성하고 A에게 공개 키를 전달한다. A는 B에게서 전달 받은 공개 키를 이용하여 키를 암호화하고 암호문을 B에게 전달한다. B는 비밀 키를 이용하여 키 암호문을 복호화한다. B는 복호화한 키를 이용하여 데이터 암호문을 복호하하여 원 데이터를 획득한다. 사용 예시 SSL 프로토콜

Public-key cryptosystem

Public-key cryptosystem 공개 키 암호 방식 공개 키 암호 방식이란 암호화와 복호화에 서로 다른 키를 사용하는 방식으로 암호화에 사용하는 키를 공개 키, 복호화에 사용하는 키를 비밀 키라고 한다. 공통 키 암호 방식에 비해 공개 키 암호 방식은 암/복호화 시간이 오래 걸리는 경향이 있다. 공개 키 암호 계산 방법 RSA 암호 타원곡선 암호 동작 흐름 A가 B에게 데이터를 전송하고자 한다고 가정해보자. 데이터를 전달 받을 B가 공개 키와 비밀 키를 생생해 공개 키를 A에게 전달한다. A는 B에게 전달 받은 공개 키를 사용해서 데이터를 암호화하고 B에게 암호문을 전달한다. B는 전달 받은 암호문을 비밀 키로 복호화하여 원 데이터를 획득한다. 특징 키 분배 방식 문제 해결 X가 공개 키와 암호문을 훔쳐본다고 하여도 공개 키로는 암호문을 복호화할 수 없으므로 원 데이터를 획득할 수 없다. 이와 같이 공개 키 암호 방식에서는 키 분배 방식 문제가 발생하지 않는다. 다수 간 데이터 교환 용이 불특정 다수 간의 데이터 교환이 쉽다는 장점이 있다. 공개 키는 노출되어도 상관없으므로 B가 공개 키를 인터넷 상에 공개해두었다고 한다면 B에게 데이터를 전송하고자 하는 다수의 사람들이 각자 B가 공개한 공개 키를 가져와 데이터를 암호화하여 B에게 전달하고 B는 보관 중인 비밀 키로 데이터를 복호화하면 되므로 데이터를 전송하는 상대방 모두가 키를 가지고 있을 필요가 없다. 또한 데이터를 전달 받는 측에서 비밀 키를 노출되지 않게 관리하면 되므로 안전성이 높다. 문제점 긴 암/복호화 시간 암호화 및 복호화 시간이 오래 걸린다. 따라서 데이터의 연속적 교환이 필요한 구조에서는 부적합하다. 해결책 하이브리드 암호 방식) 공개 키 신뢰 문제가 발생한다. A가 B에게 보내는 데이터를 훔쳐 보고자하는 X가 자신의 공개 키와 비밀 키를 생성 후 B가 A에게 공개 키를 보낼 때, X 자신의

Symmetric-key cryptosystem

Symmetric-key cryptosystem 공통 키 암호 방식 공통 키 암호 방식이란 공통 키 암호 방식은 암호화와 복호화에 동일한 키를 사용하는 암호 방식이다. A가 B에게 데이터를 전달하고자 할 때, 원 데이터를 키로 암호화한 후 B에게 전달하면 X에게 전송 데이터가 노출된다 하여도 원 데이터를 보호할 수 있다. A는 원 데이터를 키로 암호화하여 암호문을 B에게 전달 --> B는 전달 받은 암호문을 A의 키로 복호화하여 원 데이터 획득 공통 키 암호 방식의 계산 방법 시저 암호 (Caesar cipher) AES (Advanced Encryptioin Standard) DES (Data Encryption Standard) OTP (One Time Pad) 키 분배 문제 문제점 X가 암호문을 훔쳐볼 수 있다고 가정할 때, B가 A의 키를 가지고 있지 않다면 A는 특정 수단을 사용해서 B에게 키를 전달해야 한다. 인터넷을 통해서 전달한다면 X가 키를 획득하여 암호문을 복호할 위험이 있다. 이렇게 키 전달 방법에 문제가 있다는 것을 알 수 있다. 만약 키를 암호화한다 하여도 키 암호화에 사용한 키를 전달해야 하므로 동일한 문제에 직면하게 된다. 공통 키 암호 방식에서는 키를 안전하게 전달하는 방법에 문제가 발생하고 이를 키 분배 문제라고 한다. 해결책 키 교환 프로토콜 이용 공개 키 암호 방식 이용

hash

hash 해시 함수 해시 함수란 해시함수란 데이터를 고정 길이의 불규칙적인 숫자로 변환하는 함수이다. 이 때 출력되는 값을 해시 값이라 한다. 해시 값은 보통 16진수 형태로 출력되지만 내부에서는 2진수로 관리되고 있으며 컴퓨터 내부에서 수리 연산을 수행하고 있다. 특징 출력하는 값의 길이가 바뀌지 않는다. 예를 들어 SHA-1에서는 20 바이트로 고정된다. 이는 입력되는 데이터의 크기와 무관하게 유지된다. 입력이 동일하면 출력도 반드시 동일하다. 데이터의 유사도와는 무관하게 1 비트라도 다른 데이터라면 그 출력은 판이하게 다르다. 전혀 다른 데이터를 입력해도 동일한 해시 값이 출력될 확률이 존재한다. 이를 해시 값 충돌이라 한다. 해시 값으로 원 데이터를 역산하는 것은 불가능하다. 데이터의 흐름은 단 방향으로 이것은 암호와의 차이점이다. 해시 연산은 비교적 간단하다. 사용 예시 메시지 인증 코드 해시 테이블

cryption-basic

cryption-basic 암호의 기본 의의 A가 B에게 인터넷을 이용하여 데이터를 전달하고자 할 때 그냥 전달항다면 악의를 가진 제 3자가 훔쳐볼 가능성이 있다. 그러므로 암호화한 암호문을 전달하고 전달 받은 B는 이를 복호화하여 원본 데이터를 얻는다. 컴퓨터에서 암호란 컴퓨터는 데이터의 형식과 무관하게 모든 데이터를 0과 1로 구성되는 2진수로 관리한다. 이를 특정 연산을 통해서 컴퓨터가 해석할 수 없는 숫자 형태로 변경하는 것을 의미한다. 암호 수치 연산에는 키를 이용하는 데, 키는 숫자로 구성되어 있으며 암호를 위한 암호키, 복호를 위한 복호키가 있다. 예시 XOR을 이용한 구체적 예시를 살펴보자. XOR은 A ⊕ B = C A \oplus B = C A ⊕ B = C A = B ⊕ C A = B \oplus C A = B ⊕ C 가 성립되는 특징이 있다. 이를 암/복호에 적용하면 다음과 같다. 암호 : O r i g i n a l D a t a ⊕ K e y = C r y p t o g r a m Original Data \oplus Key = Cryptogram O r i g i n a l D a t a ⊕ K e y = C r y p t o g r a m 복호 : C r y p t o g r a m ⊕ K e y = O r i g i n a l D a t a Cryptogram \oplus Key = Original Data C r y p t o g r a m ⊕ K e y = O r i g i n a l D a t a

security-overview

security-overview 보안 개요 도청 대응 방안 : 암호화 기술 A가 B에게 메시지를 전송할 때 경로 상에 있는 X가 메시지 내용을 훔쳐볼 가능성이 있다. 위장 대응 방안 : 메시지 인증 코드, 전자 서명 A가 B에게 메시지를 전달했다고 생각하지만 X가 B로 위장하여 전달받았을 가능성이 있다. B가 A에게 메시지를 받았다고 생각했지만 X가 A로 위장하여 전달했을 가능성이 있다. 변조 대응 방안 : 메시지 인증 코드, 전자 서명 A가 B에게 메시지 전달을 성공했을지라도 도중에 X가 메시지 내용을 변경했을 가능성이 있다. 사후 부인 대응 방안 : 전자 서명 B가 A에게 메시지를 받았다고 생각하지만 A가 악의적으로 이를 부인할 가능성이 있다.

HTML/CSS를 활용하여 카카오톡 클론 만들기

시간을 내어 HTML과 CSS를 공부한 것은 대학생 때가 마지막이었던 것으로 기억한다. 그 동안 사이드 프로젝트로 진행했던 여러 아이디어들을 결국 서비스하지 못했던 결정적인 이유는 프론트 엔드 기술 부족이었다고 생각하고 우선 HTML과 CSS 학습을 진행하였다. 프론트 엔드 기술은 많은 발전을 거듭하여 예전에 비해 큰 복잡성을 가지게 되었다. 빠른 시간 안에 숙지하지 못한 기법들에 대해서 알아보고 구현하고자 하는 아이디어에 활용할 수 있을 정도로 진행해보고자 한다. 또한 보안적 관점에서 발생할 수 있는 프론트 엔드 위협에 대해 파악할 수 있는 좋은 밑거름이 되길 기대해본다. 우선적으로 진행한 카카오 톡 디자인 클론은 노마드 아카데미의 강의를 수강하며 진행하였고 결과는 아래의 링크에서 확인할 수 있다. 소스코드 저장소 구현된 웹 페이지

Ready-to-programming

Ready-to-programming 프로그래밍 기본 환경 구성 정리 프로그래밍을 시작하기 위한 기본 환경 구성 정리 개인적으로 아톰 에디터를 활용한 환경 구성을 선호한다. 다른 에디터에 비해서 풍부한 플러그인과 보기 좋은 UI는 아톰을 선택하기에 충분한 이유가 된다. 설치 플러그인 vim-mode vim-mode-plus vim-mode-plus-ex-mode prettier-atom -> Format Files on Save, Show in Status Bar 설정 pigments minimap git-plus emmet color-picker Vim 타이핑 환경은 매우 효율적이다. 아직 활용도가 낮은 편이지만, 어느정도 적응되고 나면 메모장보다 gvim을 실행하는 자신을 볼 수 있다. 아톰에서도 마찬가지로 vim-mode를 설치하여 Vim 타이핑 환경을 구성하여 사용한다.

Heap-Memory

Heap-Memory 힙 메모리 이해하기 많은 메모리 할당자가 존재한다. dlmalloc - 범용 할당 자 ptmalloc2 - glibc jemalloc - FreeBSD와 Firefox tcmalloc - Google libumem - 솔라리스 모든 메모리 할당자는 빠르고 확장 가능하며 효율적이라고 주장하지만 모든 할당자가 개발하고자하는 어플리케이션에 적합할 수 는 없다. 메모리 사용량이 많은 응용 프로그램의 성능은 메모리 할당자 성능에 크게 좌우된다. 이 글에서는 glibc malloc 할당자에 대해서만 이야기하고자 한다. ptmalloc2 는 dlmalloc 에서 분기되었다. fork 후 스레딩 지원이 추가되어 2006년에 릴리즈되었다. 공식 릴리즈 후 ptmalloc2 는 glibc 소스 코드에 통합되었다. System call 시스템 호출 : malloc 은 내부적으로 brk 또는 mmap 시스템 호출을 한다. Threading 스레딩 : 리눅스 초기에는 dlmalloc 이 기본 메모리 할당자로 사용되었다. 하지만 나중에 ptmalloc2 의 스레딩 지원으로 리눅스 용 기본 메모리 할당자가 변경되었다. 스레딩 지원은 메모리 할당자 성능 및 응용 프로그램 성능을 향상시키는 데 도움이 된다. dlmalloc 에서 두 개의 스레드가 동시에 malloc 을 호출 할 때, freelist 데이터 구조가 사용 가능한 모든 스레드간에 공유되기 때문에 하나의 스레드 만 임계 섹션에 들어갈 수 있었다. 따라서 다중 스레드 응용 프로그램에서 메모리 할당에 시간이 걸리므로 성능 저하를 유발한다. ptmalloc2 에서 두 스레드가 동시에 malloc 을 호출하는 동안 각 스레드는 별도의 힙 세그먼트를 유지하므로 이 힙을 유지하는 freelist 데이터 구조도 분리되어 메모리를 즉시 할당할 수 있다. 각 스레드에 대해 별도의 힙 및 freelist 데이터 구조를 유지하는 이 작업을 스레드 별

요즘 나를 즐겁게 하는 것들

나를 즐겁게 하는 일이 무엇인 가를 살펴보는 것은 내가 어떤 사람인지 깨달을 수 있는 좋은 방법이다. 카페에서 하는 노트북, 세바시 강연, 파이썬 프로그래밍, 수수께끼 같은 신규 취약점은 나를 즐겁게 한다. 목표를 향해 제대로 가고 있는 지 알 수 없지만, 아직 컴퓨터가 나를 즐겁게 한다는 것에 안도감을 느낀다. 잘하고 싶은 마음도 간절하지만, 지금처럼 앞으로도 계속 내가 컴퓨터를 좋아하는 사람이었으면 한다.

Heap-Syscall

Heap-Syscall 힙 메모리 할당과 시스템 호출 malloc 은 OS에서 메모리를 얻기 위해 brk 또는 mmap syscall을 사용하여 메모리를 확보한다. brk brk : brk 는 프로그램 중단 위치를 증가시켜 커널에서 메모리를 얻는다. 처음 시작( start_brk ) 및 힙 세그먼트 끝( brk )은 동일한 위치를 가리킨다. ASLR이 꺼지면 start_brk 및 brk 는 data/bss 세그먼트 ( end_data )`끝을 가리킨다. ASLR이 켜지면 start_brk 및 brk 는 data/bss 세그먼트 ( end_data )끝에 임의의 brk 오프셋을 더한 것과 같다. 위의 프로세스 가상 메모리 레이아웃 그림은 start_brk 가 힙 세그먼트의 시작이고 brk (프로그램 중단)이 힙 세그먼트의 끝임을 보여준다. 예시 /* sbrk and brk example */ # include <stdio.h> # include <unistd.h> # include <sys/types.h> int main ( ) { void * curr_brk , * tmp_brk = NULL ; printf ( "Welcome to sbrk example:%d\n" , getpid ( ) ) ; /* sbrk(0) gives current program break location */ tmp_brk = curr_brk = sbrk ( 0 ) ; printf ( "Program Break Location1:%p\n" , curr_brk ) ; getchar ( ) ; /* brk(addr) increments/decrements program break location */ brk ( curr_brk + 4096 ) ; cu