암호화 로직을 공개하고 암호화 키를 비공개하여 암호화 키를 모를 경우에 풀이 난이도가 상승하는 암호화 방식
암호화 키를 하나씩 대입하여 암호를 푸는 경우 몇백 년 정도의 시간이 걸리기 때문에 짧은 시간 내에 암호를 풀어야 할 경우에는 암호화 방식 특성상 안전하다고 생각한다.
종류에는 DES, AES, SEED 등이 있다.
2. 비대칭키 암호화
비대칭키는 공개키와 개인키로 2개의 암호화 키가 있다. 공개키는 말 그대로 공개된 키이며 개인키는 사용자만 알고 있는 키이다. 공개키로 암호화를 할 경우 개인키로 복호화할 수 있고 반대로 개인키로 암호화한 경우 공개키로 복호화할 수 있다. 비대칭키 암호화 방식은 공개키로 암호화하는 경우와 개인키로 암호화하는 경우로 나눌 수 있는데 공개키로 암호화했다면 데이터 보안에 중점을 둔 것이고, 개인키로 암호화했다면 안전한 전자서명을 통한 인증 과정에 중점을 둔 것으로 해석할 수 있다. 비대칭키의 대표 알고리즘은 RSA, 디피-헬만, 타원곡선 암호 등이 있다.
3. 단방향 암호화 (해시)
단방향 암호화는 보통 검증을 위해 사용하거나 평문을 모르게 하기위해 사용한다. 1비트만 달라져도(일부러 같은 해시값을 가지도록 조작하기 힘듬) 단방향 암호화 결과값이 달라지기 때문에 파일의 유효성을 검증하는데 사용한다.
해시는 암호문을 평문으로 복원할 수 없기 때문에 평문을 알아낼 필요가 없는 곳에 쓰이는데 대표적으로 사이트 비밀번호를 함호화 하는데 쓰인다.
OWASP(Open Web Application Security Project)는 2001년도에 만들어진 국제 온라인 보안 단체이다. OWASP 가 진행한 프로젝트 중 가장 유명한 것은 OWASP Top 10 인데, 이는 매 2~3년마다 업데이트되며 웹에서 가장 중요한 보안 취약점을 10개를 정리한 문서이다.
2021년에 달라진 점
새로운 카테고리 3개가 생겼고 4개의 카테고리는 범위와 이름이 변경되었으며 몇 개의 카테고리는 통합되었다.
TOP 10
01 : Broken Access Control
취약한 접근 제어는 2017년 5위에서 2021년 1위로 중요도가 상승하였다. 접근 제어란 사용자가 자신의 권한을 벗어난 행동을 할 수 없도록 제한하는 것을 말한다. 그 제한이 올바르게 작동하지 않을 때를 취약한 접근 제어라 한다. 취약한 접근 제어는 개인정보 탈취 뿐만 아니라 개인정보를 수정하거나 삭제하는 공격으로 이어질 수 있다.
버그 또는 설계 결함으로 인한 권한 상승
CORS의 잘못된 구성으로 인해 신뢰할 수 없거나 허가되지 않은 소스에서 API 액세스 허용
인증이 필요하거나 권한이 있는 페이지 접근 허용
02 : Cryptographic Failures
암호화 오류는 민감한 개인정보를 암호화하지 않거나 취약한 암호화 알고리즘을 사용하는 것을 의미한다.
이 항목은 "민감한 데이터 유출"이였지만 원인보다 결과를 중점으로한 이름이였기에 변경하였다.
중요한 데이터를 일반 텍스트로 저장 또는 전송
오래되었거나 취약한 암호화 알고리즘 사용
서버 인증서 및 신뢰 체인의 유효성을 제대로 검사하지 않음
03 : Injection
주입 공격이란 임의의 쿼리 또는 명령을 실행하여 웹 사이트의 데이터를 변경하거나 데이터 베이스를 조회, 수정, 삭제하는 공격이다. 가장 대표적인 injection 공격은 SQL injection과 사이트 간 스크립팅(XSS) 공격이 있다.
사용자가 입력한 데이터를 검증, 필터링 하지 않음
04 : Insecure Design
안전하지 않은 설계 취약점은 설계와 아키텍처의 결함에 중점을 둔다.
구현의 결함과 다른 것으로 취약한 설계로 잘 구현된 것은 여전히 공격에 취약하다.
소프트 웨어 개발 단계가 계획/분석 -> 설계 -> 구현 -> 검증 -> 배포 이런식으로 흘러간다면
초기 단계(설계)에서 생기는 오류는 중간 단계(구현)에서 보완할 수 없다는 뜻인 듯 합니다.
05 : Security Misconfiguration
취약한 환경설정
응용프로그램의 모든 부분에서 보안 강화 부족
클라우드 서비스에 대한 사용 권한이 잘못 구성됨
포트, 서비스, 페이지, 계정 또는 권한과 같은 불필요한 기능 허용 또는 설치
기본 계정/암호가 사용 가능 또는 변경되지 않음
사용자에게 표시되는 오류 메시지에 스택 추적 또는 기타 중요한 정보가 포함됨
최신 보안 기능이 활성화 또는 구현되지 않음
소프트웨어가 최신 버전이 아님
06 : Vulnerable and Outdated Components
취약하거나 오래된 구성요소 사용
사용하는 클라이언트측 및 서버측 구성 요소의 버전을 모를 경우
소프트웨어가 취약하거나, 지원되지 않거나, 최신 버전이 아닌 경우
개발자가 업데이트 또는 패치된 라이브러리의 호환성 테스트를 수행하지 않는 경우
구성 요소의 구성이 안전하지 않은 경우
07 : Identification and Authentication Failures
식별 및 인증 오류
자동화된 공격으로부터 보호되지 않음
무차별 공격 허용
기본 암호, 취약하거나 잘 알려진 암호 사용 허용
다요소 인증을 사용하지 않거나 유효하지 않음
URL에서 식별된 세션 노출
로그인 후 식별된 세션 재사용
로그아웃 또는 비활성 상태일 때 사용자 세션 및 인증 토큰이 제대로 무효화되지 않음
08 : Software and Data Integrity Failures
소프트웨어 및 데이터 무결성 오류는 무결성이 검증되지 않은 소프트웨어 업데이트, 중요 데이터 및 CI/CD 취약성과 관련된다.
09 : Security Logging and Monitoring Failures
보안 로깅 및 모니터링 오류는 "충분하지 않은 로깅과 모니터링"에서 더 많은 유형의 보안 취약점을 포함하도록 확장되었다.
로그인, 실패한 로그인 및 기타 유형의 이벤트가 기록되지 않음
경고 및 오류로 인해 메시지가 생성되지 않거나 명확하지 않음
API 및 응용 프로그램 로그에서 의심스러운 작업을 검사하지 않음
로그만 로컬로 저장하는 경우
응용 프로그램을 실시간으로 공격을 탐지 또는 경고할 수 없음
10 : Server-Side Request Forgery
SSRF는 사용자가 요청한 URL의 유효성을 검사하지 않을 때 발생한다. 이를 통해 공격자는 방화벽, VPN 또는 다른 유형에 의해 보호되더라도 조작된 요청을 예기치 않은 대상에게 전송하도록 강제할 수 있다.
“검색을 안하면 개발을 못하는 개발자”는 인터넷을 뒤져서 본인이 이해하지도 못한 코드를 복붙하는 개발자를 비판하려는 의도인 것 같습니다. 이런 비판 때문에 검색을 안하며 개발하는 개발자들이 있습니다.
하지만 반대로 “검색을 안하며 개발하는 개발자”도 위험할 수 있습니다. 검색은 내가 이미 알고 있는 방법보다 더 좋은 방법이 있는지 찾는 것 이기때문입니다. 경력이 많은 개발자 중, 10년~20년 전에 쓰이던 기술이나 방법만을 고집하는 분들을 종종 봅니다. 최신 기술이 항상 좋은 것은 아니지만 2020년에 새로운 사이트를 개발하면서 Python 2.7과 jQuery를 선택한다면 대체로 부적절한 판단일 가능성이 높습니다. 하지만 의외로 이런 경우가 제법 있습니다.
지금 풀려는 문제를 모르겠으면 검색을 해야 합니다. 지금 풀려는 문제가 너무 익숙해도 검색을 하면 좋습니다. 검색을 안 하면 개발을 못하는 개발자도 위험하지만, 검색을 안 하면서 개발하는 개발자도 위험합니다.
구글에서 검색하기
대체로 구글이 다른 검색 엔진에 비해 뛰어납니다. 심지어 네이버 API를 잉용하는 방법을 찾을 때에도 네이버보다 구글이 더 좋은 검색결과를 보여줍니다.
검색은 영어로
IT 관련 분야의 대부분의 정보는 영어로 생산되기 때문에 한국에 특화된 문제를 검색하는 경우를 제외하고는, 영문으로 검색할 때 더 좋은 결과를 얻을 수 있습니다.
심지어 모든 분야에서 영어로 검색하는 것이 좋다는 우스갯소리로 "한국사도 영어로 검색한다"는 말이 있습니다.
검색 엔진의 기능을 잘 쓰기
구글에서는 특정 단어를 큰따옴표에 넣어 검색하면 좀 더 정확한 검색을 할 수 있고 '-검색어'를 추가하여 특정 검색어를 제외한 결과를 얻을 수 있다. 더 많은 구글 검색엔진 기능
6) "키워드 검색" 키워드가 그대로 들어가 있는 검색을 하고 싶다면 해당 키워드를 " " 안에 포함해서 검색하면 된다. eg) python randint vs randrange 검색 시 관련 내용이 검색되고, python "randint vs randrange" 로 검색 시 ""안에 키워드가 무조건 포함된 게 검색된다.
7) +포함 , -제외 파이썬으로 엑셀자동화하는 방법을 검색할 때 openpyxl이 제외된 결과를 보고싶다면,
(python excel automation library -openpyxl)를 검색하면 된다.
검색 결과 중 클릭할 문서 잘 찾기
검색 결과, 적절한 문서가 나왔음에도 불구하고 엉뚱한 문서를 클릭해서 읽는 경우가 있습니다. 적절한 문서를 추려내 ctrl+click(맥은 ctrl+click 또는 휠 클릭)으로 여러개의 문서를 열어두고 하나씩 읽으면 편리합니다.
정보의 시의성
내가 찾고자 하는 문제의 맥락에 비추어 시의성이 적절한지 판단할 필요가 있습니다. 예를 들어 자바스크립트 Array와 관련된 검색을 했는데, 2010년 문서와 2019년 문서가 각각 나왔다면 2019년 문서를 보는 것을 추천합니다. 자바스크립트는 최근 10년 사이에 많이 변했기 때문입니다. 라이브러리, 프레임워크 (수개월) 각종 표준, 프로그래밍 언어, 운영체제 (수개월~수년) 각종 프로세스, 설계 방법론 등 소프트웨어 공학에서 다루는 주제들 (수년~수십년) 알고리즘, 자료구조, 프로그래밍 언어론, 운영체제론 등 주로 전산학에서 다루는 주제들 (수십년)
구글의 경우 검색창 아래에 Tools를 클릭하여 Any Time를 설정하여 최근 문서를 검색할 수 있습니다.
검색어 바꿔보기
검색 결과에 딱히 마음에 드는 문서가 없으면 페이지를 넘기기 보다 검색 키워드를 바꿔보길 추천합니다. 검색어만 제대로 입력하면 대체로 최상단에 원하는 결과가 나옵니다. 검색 결과 하단에 있는 “Searches related to…” 부분을 참고하여 관련 키워드를 찾아보는 것도 좋습니다.
버전 확인하기
프로그래밍 언어나 운영체제 등은 버전에 따라 적절한 정보가 다릅니다. 파이썬의 경우 특히 버전2와 버전3는 제법 큰 차이가 있으니 버전을 정확히 확인하는 것이 좋습니다. [언어][필요시 버전][핵심 검색어][필요시 OS]으로 검색
원하는 결과가 잘 안나오면…
10분 이상 찾았는데도 모르겠으면 이 문제에 대해 지나치게 모르고 있기 떄문입니다. 그럴때면 공식 가이드라인, 공식 레퍼런스, 좋은 교과서, 논문, 위키백과 등을 찾아 읽으며 맥락 파악을 하는 편이 좋습니다. 사실은 어떤 라이브러리나 프레임워크를 이용하기 전에 반드시 공식 사이트에서 제공하는 기본적인 문서(레퍼런스 제외)를 꼼꼼하게 읽어두는 것이 좋습니다.
지식의 감가상각과 잔존가치
지식에도 감가상각이 있습니다. 어떤 지식은 잔존 가치가 더 빠르게 줄어들고 어떤 지식은 더 오래갑니다. 앞서 말씀드린 바와 같이, 최신성이 중요한 문제라면 더 자주 검색을 해보면 좋습니다. 오래가는 지식을 쌓아가려는 노력과 빠르게 변하는 지식을 갱신하려는 노력을 병행해야 합니다.
인류의 수천 년 속에서 위대한 왕과 장군들은 적에게 중요한 정보가 들어가지 않을까 우려했고 이에 각국 정부는 안전한 암호를 만드는 부서를 운영하였고 적국에서는 비밀을 빼내려는 암호 해독가를 양성했다. 암호의 역사는 암호를 만드는 사람들과 암호를 해독하려는 사람들이 벌여온 전쟁의 역사이다.
암호의 어원은 그리스어의 비밀이란 뜻을 가진 크립토스(Kryptos)로 알려져 있다. 이는 평문을 해독 불가능한 형태로 변형하거나 암호화된 통신문을 원래의 해독 가능한 상태로 변환하기 위한 모든 수학적인 원리, 수단, 방법 등을 취급하는 기술이나 과학을 말한다.
암호 기술의 발전 역사를 구분할 때 흔히 두 번의 큰 전환점을 기준으로
고대 암호, 근대 암호, 현대 암호 등의 세 단계로 나눠진다. 첫 번째 전환점은 1920년대, 1, 2차 세계 대전 두 번째 전환점은 컴퓨터를 이용한 암호 기술 이러한 전환점을 기준으로 고대로부터 1, 2차 세계 대전 이전가지 사용된 초보적인 암호 기술들을 고대 암호라고 하면, 1970년대까지 복잡한 기계 장치와 전자 장치들을 이용한 암호 기술을 근대 암호, 컴퓨터가 개발된 이후 컴퓨터를 이용하는 암호 기술을 현대 암호라고 부른다.
고대 암호
고대 봉건 사회에서는 지방 관리에게 보내는 비밀문서, 전쟁 중의 작전 지시와 보고, 첩자들과의 통신 등에 다양한 비밀통신 기법들이 사용되었다. 예를 들어, 멀리 기밀 정보를 전달해야 하는 경우에는 사자의 머리를 깎고 메시지를 쓴 후 머리를 길러서 보내면 받는 측에서는 사자의 머리를 깎고 메시지를 읽도록 하였다. 또 종이에 쓴 메시지가 그냥 보이지 않지만 불빛에 약품 처리를 하면 메시지가 나타나도록 하는 방법, 비밀 노출을 방지하기 위해 말로 전달하도록 하는 방법 등이 다양하게 사용되었다. 이러한 비밀 통신 방법을 스테가노그래피(Steganography)라고 하는데 적들도 이 통신 방식을 알고 있으면 비밀을 유지하기 어렵다는 한계를 갖고 있다.
스키테일 암호
현재까지 기록된 역사 속에 최초로 등장한 암호는 ‘스키테일’로도 잘 알려진 이른바 ‘치환 암호’다.
기원전 500년 경 스파르타에서는 전쟁 중 왕의 명령을 전할 때 이 스키테일을 활용했다. 원리는 다음과 같다. 우선 전쟁에 나가는 군대가 왕과 굵기가 같은 원통형 막대기를 나눠 갖고, 메시지를 전달해야 될 상황이 오면 리본을 원통에 둘둘 말아 그 위에 메시지를 적는다. 이후 리본을 풀어 보면 일정한 간격으로 글자가 채워지는데, 빈 공간에 아무 글씨나 채워 넣으면 같은 지름의 원통을 가진 이들만 해당 암호를 해독할 수 있게 된다.
시저(Caesar) 암호
율리우스 카이사르가 사용했던 ‘카이사르 암호'
a를 d로 치환했으면, b는 e로, c는 f로 치환하는 방식으로 마지막 z는 c가 된다. 즉, d부터 시작하는 알파벳으로 글을 쓰고 이를 통해 중요한 내용을 전할 수 있다. 만약 Rome을 카이사르 암호를 활용해 암호화하면, ‘urph’라는 알 수 없는 단어가 등장하게 된다.
근대 암호
기계의 발달, 그리고 제 1·2차 세계대전으로 암호학은 비약적으로 발전했다. 근대 암호는 전자기계식 암호화 장치를 이용하는 기계 암호를 특징으로 한다. 이전에도 암호 대치 표나 막대 등의 보조도구를 사용하였지만, 기계를 도입함으로서 본격적으로 복잡한 수학 이론을 적용할 수 있었기에 해독에 상당한 어려움이 있었다.
에니그마
T를 입력하면 플러그보드와 3개의 회전자, 반전자를 거쳐 알파벳 G로 암호화된다.
기계 암호로 가장 대표적인 것은 에니그마이다.
에니그마는 1918년 독일에서 발명된 암호화 기계로, 원래 상업적 목적으로 쓰였고 제1차 세계대전에서 독일군이 사용하면서 유명해졌다.
에니그마는 알파벳을 입력하는 타자기와 암호키가 내장된 회전자, 회전자를 연결하는 전기 배선, 그리고 반전자로 구성되어있다.
에니그마에는 각기 다른 암호키를 가진 3~5개의 회전자가 전기적으로 연결되어 있어, 타자기로 평문을 입력하면 회전자에 의해 다중으로 치환된 암호문이 출력된다.
이 암호문을 회전자와 배선, 반전자의 설정이 동일한 에니그마에 다시 입력하면 평문이 출력되면서 복호화가 이루어진다. 독일군은 에니그마의 보안성을 높이려고 반전자를 도입하고 의도적인 오·탈자까지 내었기 때문에, 똑같은 설정의 에니그마가 없으면 암호 해독은 거의 불가능하지만, 연합군의 암호 해독팀은 연산 기계를 이용해 에니그마를 해독하는 데 성공하였고, 이는 연합군의 승전에 큰 기여를 하게 된다. 이미테이션 게임연합군의 연산 기계는 컴퓨터의 시초가 되었다고 한다.
현대 암호
현대 암호는 1970년대 후반 스탠퍼드 대학과 MIT 대학에서 시작되었다. 1976년 스탠퍼드 대학의 Diffie와 Hellman은 ‘암호의 새로운 방향(New Directions in Cryptography)’이라는 논문에서 처음으로 공개키 암호의 개념을 발표하였다. 종래의 관용 암호 방식 또는 대칭키 암호 방식에서는 암호화 키와 복호화 키가 동일한 비밀키를 사용하기 때문에 송신자와 수신자는 비밀 통신을 하기 전에 비밀키를 공유하고 있어야 한다. 반면 공개키 암호 방식에서는 하나의 쌍이 되는 공개키와 비밀키를 생성하여 암호화에 사용되는 공개키는 공개하고, 복호화에 사용되는 비밀키는 사용자가 안전하게 보관하도록 한다. 공개키 암호 방식에서는 송신자와 수신자가 사전에 키를 공유할 필요가 없기 때문에 불특정 다수 사용자 간에 사전 준비가 없이도 암호 통신망을 구축하는데 유용하게 사용할 수 있다.
이어 1978년 MIT 대학의 Rivest, Shamir, Adleman은 소인수 분해 문제에 기반을 둔 RSA 공개키 암호를 개발했는데, 이것은 오늘까지도 가장 널리 사용되는 공개키 암호 방식이다. 공개키 암호의 도입은 현대 암호의 발전에 중요한 계기가 되었다.
한편, 1977년 미국 상무성 표준국(NBS, 현 NIST)은 전자계산기 데이터 보호를 위한 암호 알고리즘을 공개 모집하여, IBM 사가 제안한 DES (Data Encryption Standard)를 표준 암호 알고리즘으로 채택했다. DES의 표준화를 계기로 하여 금융 시스템을 중심으로 상업용 암호화의 이용이 증가하게 되었고 컴퓨터 통신망을 이용한 문서 전송, 전자 자금 이체 등이 활성화되었으며 암호 방식이 일반인들에게 알려지고 널리 사용되는 계기가 되었다.
이전의 암호 방식에서는 사용하는 키뿐만 아니라 암호 알고리즘도 비밀로 하여 암호문의 비밀을 지키려고 하는 경우도 있었으나, 현대 암호에서는 암호 알고리즘을 공개하도록 하고 있다. 1883년 Auguste Kerckhoff는 암호 시스템의 안전성에 대해 ‘키 이외에 암호 시스템의 모든 것이 공개되어도 안전해야 한다’고 했는데 이것을 Kerckhoff’s principle이라고 한다. 이렇게 함으로써 암호 방식의 안전성을 공개적으로 검토하게 하여 안전성을 확인하는 것이다.
정규표현식이란 규칙을 가진 문자열을 표현하는데 사용하는 형식 언어입니다. 주로 문자열의 검색과 치환을 위해 사용하고 있습니다. 문자열이 특정한 조건을 만족하는지 분류가 필요한 경우 조건문을 사용하면 복잡하지만, 정규표현식을 이용하면 간단하게 분류 할 수있습니다. 하지만 간단한 만큼 가독성떨지는 단점이 있습니다.
표현식
의미
^x
문자열의 시작을 표현하며 x 문자로 시작됨을 의미한다.
x$
문자열의 종료를 표현하며 x 문자로 종료됨을 의미한다.
.x
임의의 한 문자의 자리수를 표현하며 문자열이 x 로 끝난다는 것을 의미한다.
x+
반복을 표현하며 x 문자가 한번 이상 반복됨을 의미한다.
x?
존재여부를 표현하며 x 문자가 존재할 수도, 존재하지 않을 수도 있음을 의미한다.
x*
반복여부를 표현하며 x 문자가 0번 또는 그 이상 반복됨을 의미한다.
x|y
or 를 표현하며 x 또는 y 문자가 존재함을 의미한다.
(x)
그룹을 표현하며 x 를 그룹으로 처리함을 의미한다.
(x)(y)
그룹들의 집합을 표현하며 앞에서 부터 순서대로 번호를 부여하여 관리하고 x, y 는 각 그룹의 데이터로 관리된다.
(x)(?:y)
그룹들의 집합에 대한 예외를 표현하며 그룹 집합으로 관리되지 않음을 의미한다.
x{n}
반복을 표현하며 x 문자가 n번 반복됨을 의미한다.
x{n,}
반복을 표현하며 x 문자가 n번 이상 반복됨을 의미한다.
x{n,m}
반복을 표현하며 x 문자가 최소 n번 이상 최대 m 번 이하로 반복됨을 의미한다.
[xy]
문자 선택을 표현하며 x 와 y 중에 하나를 의미한다.
[^xy]
not 을 표현하며 x 및 y 를 제외한 문자를 의미한다.
[x-z]
range를 표현하며 x ~ z 사이의 문자를 의미한다.
\^
escape 를 표현하며 ^ 를 문자로 사용함을 의미한다.
\b
word boundary를 표현하며 문자와 공백사이의 문자를 의미한다.
\B
non word boundary를 표현하며 문자와 공백사이가 아닌 문자를 의미한다.
\d
digit 를 표현하며 숫자를 의미한다.
\D
non digit 를 표현하며 숫자가 아닌 것을 의미한다.
\s
space 를 표현하며 공백 문자를 의미한다.
\S
non space를 표현하며 공백 문자가 아닌 것을 의미한다.
\t
tab 을 표현하며 탭 문자를 의미한다.
\v
vertical tab을 표현하며 수직 탭(?) 문자를 의미한다.
\w
word 를 표현하며 알파벳 + 숫자 + _ 중의 한 문자임을 의미한다.
\W
non word를 표현하며 알파벳 + 숫자 + _ 가 아닌 문자를 의미한다.
정규표현식을 사용할 때 Flag를 사용하지 않으면 문자열에 대해서 검색을 한번만 처리하고 종료하게 된다.
Flag는 다음과 같은 것들이 존재한다.
Flag
의미
g
Global 의 표현하며 대상 문자열내에 모든 패턴들을 검색하는 것을 의미한다.
i
Ignore case 를 표현하며 대상 문자열에 대해서 대/소문자를 식별하지 않는 것을 의미한다.
m
Multi line을 표현하며 대상 문자열이 다중 라인의 문자열인 경우에도 검색하는 것을 의미한다.