본문 바로가기
CS/BOOK

[한 권으로 읽는 컴퓨터 구조와 프로그래밍] 13. 컴퓨터 보안

by 벨롭 2024. 5. 1.
보안

 

보안을 위해서는 우선적으로 위협 모델을 찾아야한다. 위협 모델은 보안이 필요한 대상 목록괴 긱 보안 대상에 가해질 수 있는 공격을 열거해서, 공격을 방어하는 방법을 설계할 수 있게한다.

 

위협모델을 정할 때 가장 어려운 부분은 신뢰할 대상을 정하는 것이다. 우리가 사용하는 수많은 서드파티 하드웨어나 소프트웨어에 우리는 의존하고 있다. 이들이 의도적으로, 또는 무능해서, 그리고 부정직하게 신뢰를 위반한다면, 우리의 보안도 취약해질 수 밖에 없다. 따라서 컴퓨터 보안 세계에서 신뢰란, 선택할 수 없지만 의존해야하는 대상이다. 

 

 

전문보기 : https://news.mt.co.kr/mtview.php?no=2023112013561633047

 

공격에는 주로 두 가지 유형이 있다. 첫번째는 크립토그래피 시스템 공격이다. 크립토그래피란 데이터에 대한  암호화로, 이 암호 시스템의 취약점을 이용하여 공격하는 것이다. 이것보다 더 일반적인 공격방법은 사회적 공격이다. 사용자가 설치한 프로그램에 악의적인 코드가 심어져있다면 손쉽게 정보를 탈취해갈 수 있다. 실제로 최근에는 오픈소스를 이용한 사회적 공격이 급격하게 증가하고 있다.

 

공격으로부터 보호하기 위해 보안 인증과 권한부여를 제대로 구현하는 것이 방법이 될 수 있다. 인증은 어떤 사람이나 대상이 실제로 그 사람이나 대상임을 증명하는 과정이며, 권한부여는 제대로된 자격증명을 제공하지 않는 사람에게 접근을 제한하는 것이다. 즉, 자격증명을 제공하는 인증된 대상만이 데이터에 접근할 수 있도록 하는 것이다.

 

 

 

 

 

 

 

 

크립토그래피

 

앞서 말했듯이, 데이터를 암호화하는 크립토그래피는 보안시스템의 일종이다. 그렇다면 어떻게 데이터를 암호화할 수 있을까?

 

 

스테가노그래피

 

어떤 내용을 다른 내용 속에 감추는 방식을 스테가노그래피라고 부른다. 예를 들어, 이미지 속에 비밀 메시지를 숨겨두는 것이다. 이미지또한 0과 1로 이루어진 바이너리 비트이므로, 비밀 메세지의 비트를 이미지 이곳 저곳에 흩어놓는 것이다. 이미지뿐만 아니라 텍스트, 비디오, 오디오 등 활용방법은 무궁무진하다.

 

 

 

치환 암호

 

 

그림처럼 각 문자를 다른 문자로 치환하는 표를 만든다. A는 Q로, B는 W로 적는 식이다. 이 표를 이용해 암호문을 만들고, 평문으로 복호화할 수도 있다. 이처럼 암호화와 복호화에 같은 암호를 사용하는 것을 대칭 코드라고 부른다.

 

하지만 치환 암호에는 치명적인 단점이 있다. 바로 통계와 추측을 통해 쉽게 깰 수 있다는 것이다. 예를 들어 영어에서 가장 많이 사용되는 문자는 e, t, a, o, n이다. 등장하는 문자의 빈도를 계산해 알파벳을 추측해볼 수 있는 것이다.

 

 

 

치환암호를 더 복잡하게 변경하면, 일회용 패드를 이용하는 방법이 있다. 알파벳에 1부터 26까지의 숫자를 부여하고, 평문에 패드를 더한다음 26으로 나눠서 암호문을 만드는 것이다. 

 

평문 H (=18) E (=5) L (=12) P (=16)
패드 I (=9) P (=16) T (=20) E (= 5)
암호문 A (=1) U (=21) F (=6) U (= 21)

 

HELP라는 암호문에 IPTE라는 패드를 사용하면,  AUFU라는 암호문이 만들어진다.

 

 

 

전치 암호

 

 

메세지를 변경하는 또 다른 방법으로는 문자의 위치를 뒤섞는 것이 있다.

 

예를 들어 원통에 종이를 묶고, 메세지를 가로로 적은 다음 빈 공간에는 아무 알파벳이나 적는다. 그리고 종이를 풀면 알파벳들이 뒤죽박죽되어있을 것이다. 원통의 사이즈가 다르면 메시지를 알아낼 수 없다.

 

 

공개키 암호

 

위와 같이 암호방법과 복호방법이 같은 대칭암호 시스템은 유출에 취약하다. 암호화와 복호화에 사용하는 키가 다르게 하는 비대칭 암호는 이와 같은 문제 해결에 도움이 될 수 있다.

 

예를 들어, 공개키 암호는 누구에게나 알려져 있는 키로 암호화시키되, 복호화를 위해서는 비밀키를 이용해야만 한다. 한 방향으로는 계산하기 쉽지만 비밀 정보를 알지 못하면 반대 방향으로는 계산이 어려운 트랩도어 함수를 활용해서 키를 만들 수 있다. 

 

 

 

암호학적 해시 함수

 

해시 함수는 임의 길이의 입력값을 받아 고정된 길이의 출력값을 내는 함수로, 입력에서 해시값을 만들어내기는 쉬워도 해시에서 입력을 만들어내기는 어려운 단방향의 특징을 가지고 있다.

 

사용자의 비밀번호를 해시함수를 이용해 저장한다면, 해시 값이 일치하는지만 확인하면 된다. 그리고 데이터가 변화하면 해시값또한 바뀌므로, 데이터의 변조 여부 (정합성 검증) 도 가능하다.

 

https://seed.kisa.or.kr/kisa/Board/21/detailView.do

 

다른 데이터인데 해시값이 동일하면 보안에 취약점이 생겼다는 뜻이므로,  해시충돌이 일어나지 않도록 잘 짜여져 있어야한다. 최근에는 SHA 알고리즘이 주로 사용되고 있다. 단방향의 특징을 가지고 있기때문에, 알고리즘에 활용할 수 있는 소스코드또한 많이 배포되어 있다.

 

 

 

 

 

 

보안을 위한 소프트웨어 예방 조치

 

 

크립토그래피  전문가가 아니더라도, 보안상의 약점을 줄이기위한 몇가지 조치를 통해 더 안전한 프로그램을 만들 수 있다.

 

올바른 대상을 보호하라 : 모든 대상이 아닌. 꼭 필요한 대상만을 보호하라

 

로직은 세번 체크하라 : 로직의 오류는 공격에 활용될 수 있다.

 

오류를 검사하라 : 오류는 치명적인 문제로 이어질 수 있다.

 

공격 표면(=공격할수 있는 경로) 을 최소화하라 : 코드는 가능한 한 간단하게 유지한다.

 

경계 내부에 머물러라 : 오버플로우나 인덱스 바운드 등에 주의한다.

 

좋은 난수를 생성하기는 힘들다 : 논리회로로는 특정 패턴이 반복되는 의사난수를 사용함을 알라

 

네 코드를 알라 : 서드파티 코드(제 3자가 작성한 코드)는 안전하지 않을 수 있다

 

극단적 영리함은 여러분의 적이다 : 서드파티 코드를 사용한다면 이상하고 영리한 기능은 피하라

 

눈에 보이는 것을 이해하라 : 민감한 데이터를 다른 프로그램이 볼 수 있는지 확인하라.

 

과다 수집하지 마라 :안전하게 유지해야할 대상을 줄여라.

 

모아두지 마라 : 민감환 정보는 가능한 빨리 없애라.

 

동적 메모리 할당은 여러분의 친구가 아니다, : 메모리를 해제하거나 줄이기 전에 민감한 정보를 삭제하라.

 

가비지컬렉션은 여러분의 친구가 아니다 : 가비지 컬렉션을 사용하는 언어에서는 민감한 정보를 강제로 지울 수 없다.

 

코드 역할을 하는 데이터에 주의하라 : 사용자의 입력이 SQL문 주입, 자바스크립트 코드등으로 해석되지 않도록 하라. 

 

 

 

 

 

 

-- 확인문제 --

 

1. 문제를 읽고, 빈칸에 알맞은 용어를 채워넣으세요.

보안에 대한 공격에는 주로 두 가지 유형이 있다. 첫번째는 (A)이다. (A)는 암호화 시스템의 취약점을 이용하여 공격하는 것이다. 이것보다 더 일반적인 공격방법은 (B)이다. 사용자가 설치한 프로그램에 악의적인 코드가 심어져있다면 손쉽게 정보를 탈취해갈 수 있다. 실제로 최근에는 오픈소스를 이용한 (B)이 급격하게 증가하고 있다.

공격으로부터 보호하기 위해 (C)과 (D)를 제대로 구현하는 것이 방법이 될 수 있다. (C)은 어떤 사람이나 대상이 실제로 그 사람이나 대상임을 증명하는 과정이며, (D)는 제대로된 자격증명을 제공하지 않는 사람에게 접근을 제한하는 것이다. 

 

 

 

2. 자바 등의 언어에서 제공하는 가비지 컬렉션이 보안에 취약한 부분은 무엇인가?

 

 

 

 

 

-- 정답 --

 

더보기

1. (A) 크립토그래피 시스템 공격

    (B) 사회적 공격

    (C) 인증

    (D) 권한부여

 

2. 명시적인 메모리 관리 대신 가비지 컬렉션을 사용하는 언어에서는 민감한 정보를 담은 문자열 변수에 다른 데이터를 재할당하더라도, 민감한 정보가 담긴 문자열은 즉시 지워지지 않고 가비지 컬렉션이 가능한 문자열로 분류된다. 즉, 민감한 정보는 즉각적으로 지워지지 않으며 강제로 지울 방법도 없다.