본문 바로가기
개발 관련 강의 정리/10분 테코톡

[10분 테코톡] 알린의 암호 정리

by 코딩개발 2023. 7. 1.
728x90
반응형

암호의 정의
- 중요한 정보를 읽기 어려운 값으로 변환하여 제 3자가 볼 수 없게 하는 기술

- 수학적인 원리에 기반
- 보안에 기초가 되는 원천 기술

 

암호의 구성요소

 

암호의 구성 요소는 크게 보면 평문, 암호문, 암호화 알고리즘, 키 네가지가 있다. 보통은 평문과 키를 암호화 알고리즘에 넣었을 때 암호문이 나오고 암호문과 키를 복호화 알고리즘에 넣었을 때 평문이 나오는 식으로 암호가 이루어져 있다.

 

 

암호 사용의 이유

암호가 제공하는 기능이 크게 보면 네 가지 정도가 있다. 기밀성, 무결성, 인증, 부인 방지가 있다.

 


노출 위험으로부터 데이터를 안전하게 보호 - 기밀성

 

노출이나 유출의 위험으로부터
데이터를 안전하게 보호하는 방법이에요

 

 

예를 들어서 알린이 네오한테 '안녕하세요' 라는 메시지를 보냈을 때 그냥 평문 그대로 보내 버리면 다 볼 수가 있을 것이다. 데이터베이스에서도 암호화를 하지 않고 저장을 하면 유출됐을 때 다 노출이 되는 문제점이 있다.

 

 

암호화를 하면 공격자가 읽기 어렵게 만들어서 기밀성을 유지한다 라고 볼 수 있다.

 

 

변조 위험으로부터 데이터를 안전하게 보호 - 무결성

 

예를 들어서 '나 알린인데 여기로 백만원 보내줘' 라고 했을 때

 


공격자가 자기 계좌번호로 바꿔버리면 이제 네오 입장에서는 이게 바뀐지 안 바뀐지 몰라서 그냥 돈을 보내버리면 알린은 돈을 못받고 공격자가 백만원 받는다.

 

 

안전한 사용자인지 확인 - 사용자 인증

인증을 사용자가 서버를 인증 할 수도 있고 서버도 사용자를 인증해야 된다. 


예를 들어 사용자가 서버를 인증하지 않으면 "나 배달이다. 아이디, 비밀번호 줘라" 하고 공격자가 얘기를 했을 때 인증을 안하니까 그냥 그대로 줄 수밖에 없다. 그럼 공격자는 아이디, 비밀번호 알 수 있다. 공격 서버도 사용자 인증을 하지 않으면 공격자가 "나 알린이야" 그러면 "안녕 알린" 이렇게 되어버린다. 그럼 공격자는 알린인 척도 할 수 있고 서버인 척도 할 수 있다.

 

 

메시지를 송/수신 한 사실을 부인할 수 없도록 확인 - 부인 방지

 

예를 들면 인터넷에 물건을 살려고 할 때 '백만원 주면은 물건 보내주겠다' 했을 때 백만원 입금을 했는데 그때 공격자는 "왜 백만원 안 줘?" 하고 입금 사실을 부인해버리는 것이다. 그러면 백만원 손해보고 공격자는 백만원 이득보고 나는 억울한데 어디에 가서 하소연도 못하게 된다. 이렇기 때문에 입금을 했을 때 이걸 부인할 수 없도록 부인 방지 기술이 필요하다.

 

 

암호 분류

 

암호 분류는 크게 보면 두 가지고 거기에 조금 더 세세하게 나누면 세가지 정도로 할 수 있다. 우선 단방향은 암호는 암호화만 되는 해시 함수가 있고 양방향 암호는 암호화, 복호화가 다 되는 대칭키 암호, 비대칭키 암호가 있다.

 

 

대칭키 암호


대칭키 암호는 하나의 암호화와 복호화의 같은 키를 사용하는 방식을 대칭키 암호라고 한다. 그래서 하나의 키를 통신하는 사용자끼리 공유를 하고 암호화를 한다. 대칭키에는 블록 암호, 스트링 암호가 있다.

 

 

대칭키 암호 - 블록 암호


블록 암호는 간단하게 말하면 암호화를 할 때 평문은 블록끼리 단위로 맞춰서 암호화를 한다. 이 길이는 보통 키 길이로 블록 길이가 정해지고 키 길이는 보통 128bit, 192bit, 256bit로 이루어져 있다. 길이가 맞지 않으면 위에 보는 것처럼 평문이 100bit다 라고 하면 키 길이에 맞춰서 28bit를 뒤에다가 패딩을 넣어준다. 그래서 암호문이 128bit가 되고 128bit의 암호문을 복호화하면 100bit의 평문을 얻을 수 있다.

 

- Feistel 구조, SPN 구조
- SEED, HIGHT, ARIA, LEA (국산 암호) / DES, AES (외산 암호)

 

 

대칭키 암호 - 스트림 암호

 

스트림은 위에서 알아본 블록 암호처럼 큰 단위로 끊어서 암호화를 하는것이 아니라 되게 작은 단위로 암호를 한다. 보통 1bit 단위로 암호화를 하고 특별한 상황일 때는 1byte 혹은 1word 정도 길이로 암호화를 하기도 한다. 그리고 보통은 XOR로 암호화를 하기 때문에 블록 암호보다 훨씬 빠르다. 대신에 굉장히 단순하기 때문에 보안적으로는 조금 취약할 수 있다. 그리고 빠르고 연산력이 적기 때문에 무선 환경같이 컴퓨팅 환경이 낮은 곳에서 주로 사용하게 된다.

 

장점

- 비대칭키 암호보다 연산량이 적고 빠름

- 대용량 데이터 암호화 가능

 

단점

- 기밀성 외 기능 제공이 어려움

- 통신하는 수 만큼의 키가 필요하기 때문에 키 관리가 어려움

 

 

비대칭키 암호

 

비대칭키 암호는 암호화할 때랑 복호화할 때 키가 다른 것이다. 키가 두 개가 필요하고 두 개 중에 공개하는 키를 공개키 라고 부르고 숨기고 있는 키를 비밀키라고 부른다. 그래서 암호화할 때 공개키를 쓰느냐 비밀키를 쓰느냐 하는 방법에 따라서 공개키 암호, 전자 서명이라고 두 가지로 좀 분류가 된다. 그리고 연상량이 블록 암호보다 훨씬 많아서 매우 느리고 RSA, ElGamal, ECC 같은 알고리즘들이 있다.

 

 

비대칭키 암호 - 공개키 암호

 

암호화를 할 때 공개키로 암호화하는 방식을 공개키 암호화라고 하는데 이렇게 암호화를 하면 비밀키를 갖고 있는 사람만 풀어볼 수 있다. 이것은 SSL 인증서 같은데 받을 때 오른쪽과 같이 인증서 안에 공개키가 들어간다. 그리고 EC2 접속할 때 SSH를 쓸 때 pem키 많이 쓰는데, 그 pem키 열어 보면 그 안에 프라이빗키라고 적혀 있다. 즉 비밀키다.

 

 

비대칭키 암호 - 전자 서명

 

비밀키로 암호화를 하게 되면 전자 서명 방식이 된다. 그렇게 되면은 그 암호화는 비밀키를 가지고 있는 본인만 할 수 있다. 그리고 모두가 열어볼 수 있다. 그렇기 때문에 무결성 인증 부인 방지를 기능을 할 수 있다.

 

우리가 SSL 인증서 받을 때 신뢰 기관이라고 부르는 곳에서 서명을 해준다. 그 과정은 전자 서명이란 기술을 이용한 것이다. 그러면 우리는 서버 공개키가 있고 이것을 인증 기관인 비밀키로 암호화를 하면 그것을 서명이라고 부른다.

 

그러면 서버의 공개키와 서명을 가지고 인증서로 만들어서 '어디서 연결하겠다, https연결하겠다' 하면 위에 나오듯 인증서를 가져다 준다.

 

그럼 사용자는 인증 기관의 서명을 인증 기관의 공개키로 복호화를 해서 나온 서버의 공개키와 인증서에 있는 공개키가 같으면 인증이 된것이다.

 

 

비대칭키 암호

장점

- 기밀성, 무결성, 인증, 부인 방지 모두 만족 가능

- 활용도 높음

- 키 관리가 편함

 

단점

- 느리기 때문에 적은 데이터 암호화에 적합

 


해시 함수


평문의 길이가 어떻든 간에 무조건 고정된 길이로 output이 나오는 방식이 해시 형태이다. 키가 없는 것도 있고 키가 있는 것도 있고 사용하기에 따라 다르게 사용할 수 있다. 

 

- 입력이 1bit만 수정되어도 전혀 다른 해시 값 출력(눈덩이 효과)

- 단방향

- 빠름

- 무결성

- HAS-160, LSH (국산 해시 함수) / MD5, SHA-1, SHA-2, SHA-3 (외산 해시 함수)

 

 

메시지인증코드(MAC, Message Authentication Code)

 

해시 함수는 MAC같은데 쓸 수 있다. 평문은 해시 함수로 돌려서 서명을 한다. 그 평문과 해시 함수로 돌릴 해시 값을 같이 전송해주면 사용자는 똑같이 평문을 해시화해서 내가 해시한 값과 여기 있는 서명이 같으면 이 평문의 무결성이 검증된다. 평문이 수정되지 않았구나를 알 수 있다.

 

- JWT 토큰


JWT 토큰의 데이터를 보면은 위와 같은 방식으로 위의 헤더와 페이로드를  비밀키로 암호화 한다.

 

 

그렇게 나온 데이터와 서명이 있고 이것을 똑같이 해시 알고리즘으로 서명을 했을 때 위와 같이 두 서명이 같으면 유효한 토큰이다 라고 인증한다.

 

 

전자 서명(feat.비대칭키 암호)

- 대규모 데이터를 직접 비대칭키로 암호화하기 어려움

- 데이터를 해시 값으로 만들고 해시 값을 전자 서명

 

전자 서명을 할 때 비대칭키 암호화의 단점중에 대규모 데이터를 암호화 하기 어렵다. 예를 들어 평문이 1Gb다라고 하면 비대칭 키 암호로 사실상 암호화 할 수 없다.

 


이럴 때 평문을 해시 함수로 해시 값으로 만들어주면 굉장히 값이 적어지기 때문에 서명을 되게 빠르게 할 수 있다 라는 장점이 있다.


참고

https://www.youtube.com/watch?v=UJDB6e8s1Fg&ab_channel=%EC%9A%B0%EC%95%84%ED%95%9C%ED%85%8C%ED%81%AC 

728x90
반응형

댓글