안드로이드를 하다보면 MD5, SHA1, SHA-256과 같은 것들을 필연적으로 접하게 된다.

릴리즈 APK를 만들 때 .jks 확장자인 키스토어가 필요하다.

AWS 서버를 만들면 확장자가 pem인 파일을 받아야 한다.

공인인증서는 .der, .pfx와 같은 확장자로 쓰인다.

 

위에 것들을 무엇인지 알기 위해서는 해시함수, 대칭키, 공개키, 인증서 등을 알아야 한다.

 

간략하게 각각의 목적을 보자면

 

해시함수는 유일하게 식별할 수 있는 값을 만드는 함수이고

대칭키와 공개키는 데이터를 안전하게 전달하기 위해 암복호화를 위해 만들어졌다.

인증서는 자신을 증명하기 위해 사용된다.

 

 

 


 

해시함수

대상을 식별할 수 있는 해시값을 만드는 함수이다.

 

해시값의 크기와 해시함수에 따라 충돌이 일어날 수도 있지만

사용하는 대부분의 알고리즘은 유일하게 식별할 수 있게 만든다.

 

해시의 사용

1. HashMap과 같이 대상을 찾기 위한 키값으로 사용

2. 원본 데이터를 보장하기 위한 체크섬으로 사용

 

 

MD5(Message-Digest algorithm 5)

128비트 암호화 해시 함수

주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용.

임의의 길이의 메시지를 입력받아, 128비트짜리 고정 길이의 출력값을 낸다.

현재는 결함으로 인해 보안관련 용도로 쓰이는 것을 권장하지 않음.

 

SHA(Secure Hash Alogorithm)

암호화 해시 함수

최초의 SHA 알고리즘을 SHA-0라고 한다.

SHA-1은 SHA-0의 변형으로 TLS, SSL, PGP, SSH 등 많은 보안 프로토콜과 프로그램에 사용된다.

SHA-2 4종류의 변형(SHA-224, SHA-256, SHA-384, SHA-512) 통칭

 

 

 


 

암호화

 

대칭키

암호화와 복호화에 하나의 키를 사용하는 암호화 방식

하나의 키를 사용하기 때문에 키 노출시 암호화가 무의미해진다.

DES, 3DES, AES...

 

DES(Data Encryption Standard)

블록 암호의 일종, 미국 NBS에서 국가 표준으로 정한 암호

56비트의 키를 사용
3DES : DES를 세번 중첩해 만듬

 

AES(Andvanced Ecryption Standard)

DES를 대체해서 사용 중이다.

 

 

 

비대칭키(공개키)

암호화는 공개키를, 복호화는 비밀키를 사용하는 암호화 방식

누구나 암호화할 수 있지만 내용은 비밀키를 가지고 있는 사람만 볼 수 있다.

대칭키와 비교하면 매우 오래 걸린다.

RSA...

 

RSA

1024, 2048 비트의 키를 사용하며 소인수 분해를 이용한 암호화 알고리즘

기존의 알고있던 비대칭키와 반대로 비밀키로 암호화하고 공개키로 복호화가 가능하다.

 

비밀키를 암호화에 사용하면 나만 암호문을 만들 수 있다.

그렇기 때문에 전자서명의 용도로 사용할 수 있다.

 

비밀키를 복호화에 사용하면 나만 상대의 암호문을 읽을 수 있다.

서버에서 공개키를 공유하고 유저들이 암호화한 값을 복호화하여 서버만 데이터를 볼 수 있도록 사용한다.

 

 

 


 

암호화 사용법

 

A와 B가 통신하고 싶다.

 

대칭키 사용

1. 대칭키를 사용한다면 한쪽에서 우선 대칭키를 보내고

2. 서로 대칭키를 이용해 암호화 복호화하며 통신한다.

Problem. 대칭키를 보내는 과정에서 키가 노출될 수 있다.

 

공개키 사용

1. 공개키의 경우 서로 공개키만 전달한다.

2. 서로의 공개키로 암호화해서 전달한다.

3. 전달받은 데이터를 각자의 개인키로 복호화 한다.

Problem. 공개키 방식은 대칭키에 비해 속도가 현저하게 느리다.

 

대칭키 + 공개키 사용

1. 서로에게 공개키를 보낸다.

2. 한쪽에서 공개키로 대칭키를 암호화해서 전달한다.

3. 다른 한쪽은 개인키로 복호화해 대칭키를 얻는다.

대칭키를 암호화해서 보내기 때문에 대칭키가 노출되지 않고

대칭키를 통해 통신함으로 좋은 성능을 얻을 수 있다.

 

 

 


SSL 암호화 방식

 

대칭키 + 공개키를 사용해 통신에 문제가 생겼다.

공개키를 얻는 과정 중 외부의 악의적(해커) 행위로 인해 공개키를 신뢰할 수 없게 되었다.

 

기본적으로 위의 대칭키 + 공개키 방식을 사용한다.

공개키를 전달하는 과정이 복잡해졌을 뿐이다.

공개키를 인증기관에 전달해 공개키를 포함한 인증서를 만들어

전달하여 공개키에 대한 신뢰성을 높였다.

 

 

 

 

1. 사이트는 사이트의 공개키CA(인증기관)에 등록한다.

2. 사이트의 공개키해싱하고 CA의 비밀키로 암호화한다. 이 암호화값을 디지털 서명이라고 한다. 그리고 발급대상, 발급대상의 공개키, 발급자, 발급자의 서명(2번의 암호화한 값) 정보를 가지고 있는 인증서를 만든다.

3. 만들어진 인증서를 서버에 전달한다.

 

 

 

4. 유저는 CA에서 CA의 공개키를 받아 브라우저에 보관하고 있는다.

5. 서버에 접속을 요청한다.

6. 서버에서 인증서를 받는다.

7. ( 인증서의 발급자 서명을 CA 공개키로 복호화한 값 )과 ( 인증서에 포함된 공개키를 해싱한 값 )을

비교해 동일하다면 신뢰성이 있는 공개키라고 판단

 

 

 

8. 인증서의 공개키를 이용해 대칭키를 암호화하고 싸이트는 복호화하여 대칭키를 얻는다.

9. 대칭키를 이용해 통신한다.

 

인증기관에 의해서 암호화하는 것은 암호화 대상을 숨기려는 의도보다는

인증기관의 공개키를 통해 복호화됨을 확인하여 신뢰성을 얻는 것이다.

 

 

SSL(Secure Sockets Layer)

종단간 전송된 데이터를 암호화하여 인터넷 연결 보안을 유지하는 표준 기술

SSL 인증서 파일 포멧 종류로 .pem, .crt, .cer, .csr, .der, .pfx, .p12, .key, .jks 등의 포멧이 있다.

TLS(Transport Layer Security)와 함께 거론되는데 방식은 동일하다.

넷스케이프에서 SSL1.0, SSL2.0, SSL3.0까지 개발했고 SSL3.0을 기초로 IETF에서 만든 것이 TLS이다.

현재는 SSL은 결함으로 인해 사용이 중지되었음으로 우리가 사용하는 SSL은 TLS이다.

TLS를 SSL이라고 부르는 것에 대해 약간의 논란?이 있는 것 같아 보인다.

정확히 알지는 못하지만 우분투를 리눅스라 부를지 우분투라 부를지정도의 문제라고 보인다.

 

HTTP + SSL -> HTTPS

FTP + SSL + SFTP

 

 

 


 

인증서

공개키 + 비밀키 소유자 정보

 

 

인증서에 들어가는 내용

 - 일련번호

 - 소유자

 - 서명 알고리즘

 - 발행자

 - 유효기간(시작)

 - 유효기간(끝)

 - 키 사용 목적

 - 공인 키

 - 서명 알고리즘

 - 서명

 

 

 


 

이해에 도움이 된 포스팅들

 

https://rsec.kr/?p=426

 

RSA 인증서 (Certification) 와 전자서명 (Digital Sign)의 원리

공개키 비밀키로 이루어지는 RSA 알고리즘을 이해. 인증서에 포함된 공개키의 무결성을 보증하는 인증서 체인 (Certificate Chain) 에 대한 설명무결성 보증시 사용되는 해쉬 (지문, Finger Print) 와 전자

rsec.kr

https://preamtree.tistory.com/38

 

[IT 기술면접 준비자료] 대칭키, 공개키 방식과 SSL(TLS)

 정보보호 관련 수업을 들으면, 가장 먼저 배우게 되는 내용이 SSL이다. 암호화의 기원, DES, AES와 같은 개요에 해당하는 내용은 생략하고, 바로 본론으로 들어가도록 하겠다.  대칭키(Symmetric Key)

preamtree.tistory.com

 

'Common' 카테고리의 다른 글

PorterDuff  (0) 2020.08.18
Git 기본 명령어  (0) 2019.08.19
Android Studio/IntelliJ 단축키 (Window)  (0) 2019.08.17
시간 표시  (0) 2019.06.16

+ Recent posts