무언가 서비스를 개발하게 된다면 필수적으로 고려되어야 하는 사항이 바로 보안입니다. 보안은 다양한 방법으로 고려될 수 있지만 그 중 가장 기본적이면서도 중요한 것이 바로 암호화가 아닐까 싶습니다. 하지만 암호화란 그 종류가 다양하고, 지금도 계속해서 새로운 암호화 알고리즘이 개발되고 있습니다. 저 역시 서버 개발을 해오며 암호화를 해왔지만, 암호화의 종류에 대해 깊이 알지는 못했는데 http, https를 공부하며 다양한 암호 알고리즘이 존재하고 필요에 따라 선택하여 사용한다는 사실을 알게되어 공부한 내용을 바탕으로 해당 포스팅을 작성하게 되었습니다.
먼저 암호화 알고리즘에서 자주 사용하는 단어들을 정리하고 넘어가도록 하겠습니다.
- 평문(Pnaintext) : 해독 가능한 암호화 되지 않은 메세지.
- 암호문(Ciphetext) : 암호화되어 해독이 불가능한 형태의 메세지.
- 암호화(Encryption) : 평문을 암호문으로 변환하는 과정.
- 복호화(Decryption) : 암호문을 평문으로 변환하는 과정.
암호화는 대표적인 세가지 방법으로 분류할 수 있습니다.
1. 대칭키 암호화 (비밀키 암호화)
대칭키라는 것은 암호화 하는 키와 복호화를 하는 키가 동일하다. 라는 뜻입니다. 현재 가장 보편적으로 사용하는 대칭키 암호화는 현 미국 표준 방식인 AES 방식으로 128~256비트의 키를 적용할 수 있어 보안성이 뛰어나고 공개된 알고리즘이라 누구나 사용할 수 있습니다. 대칭키 암호화는 상대방에게 비밀키를 전달해야 하는데, 비밀키 자체는 암호화 되지 않은 평문이라 분실되거나 타인에게 노출되면 보안에 매우 취약해지기 때문에 키 전달 및 관리의 어려움이 있지만, 암호화 연삭 속도가 빠르기 때문에 효율적인 암호 시스템을 구축할 수 있다는 장점이 있습니다.
2. 공개키 암호화 (비대칭키 암호화)
공개키 암호화는 암호화를 하는 키와 복호화를 하는 키가 동일하지 않은 알고리즘입니다. 대칭키 암호화의 비밀키 전달의 취약점을 해결하기 위해 탄생한 알고리즘으로 대표적인 알고리즘으로는 RSA 알고리즘이 있습니다.
공개키 알고리즘은 한 쌍의 키가 존재하는데, 하나는 누구나 소유할 수 있는(공개되어진) 공개키와 특정 사람만 가지는 비밀키 입니다. 비밀키로 암호화 한 정보는 그 쌍이되는 공개키로만 복호화가 가능하고, 반대로 공개키로 암호화한 정보는 그 쌍이되는 개인키로만 복호화가 가능합니다. 즉 암호화와 복호화를 하는 키가 서로 다르기 때문에 비대칭키 암호화라고도 부릅니다.
공개키 암호화는 대칭키 방식의 비밀키 전달의 취약점은 해결하였지만, 대칭키 암호화에 비해 암/복호화 속도가 현저하게 느리다는 문제점이 있습니다. 따라서 현실적으로는 공개키 암호화를 이용해서 대칭형 암호키를 전달하고, 실제 암호문은 대칭형 암호화를 사용하는 식으로 상호 보안적인 방법을 채택하고 있습니다.
※ 대표적으로 https가 이러한 암호화 방식을 채택하고 있습니다.
3. 단방향 암호화 (해싱: hashing)
위의 대칭키와 공개키 방식이 양방향 암호화라면, 단방향 암호화는 해싱을 이용해 암호화를 하는 알고리즘으로 평문을 암호문으로 암호화하는 것은 가능하지만, 암호를 평문으로 복호화 하는 것은 불가능한 알고리즘 입니다.
복호화를 하지 않는 알고리즘이 왜 필요하냐라고 생각할 수 있지만, 이러한 단방향 암호화를 사용하는 대표적인 예가 가입된 회원들의 패스워드 같은 정보입니다. 대부분의 사람들은 많은 서비스들의 비밀번호를 공유하며 사용하기 때문에, 만약 패스워드 목록이 유출 되었을 경우 패스워드를 평문으로 복호화 할 수 있다면 연쇄적인 보안사고가 발생할 수 있습니다.
따라서 패스워드 목록이 유출되더라도 복호화할 수 없으며, 패스워드를 검증할 때 입력받은 패스워드 값을 암호화하여 암호화한 값끼리 비교하여 로그인을 검증할 수 있기 때문에 복호화를 할 필요가 없습니다.
어떤 서비스에서 비밀번호 찾기를 했을 때, 이전 비밀번호를 알려주지 않고 새로운 비밀번호를 입력해달라고 하는 것도 이와 같은 맥락으로 생각해 볼 수 있습니다. 해싱으로 암호화된 패스워드는 서비스를 관리하는 관리자도 회원들의 비밀번호를 알 수 없기 때문입니다.
※ 암호화 기술이 발전할 수록 해커들의 기술도 더불어 발전하고 있기 때문에 현재는 최소 SHA2계열. 즉 SHA256과 같은 알고리즘을 사용해서 암호호 하는것을 권장하고 있습니다.
'Computer Science > Tech' 카테고리의 다른 글
[Teah] Load Balancer(로드 밸런서) (0) | 2020.05.26 |
---|---|
[Tech] IEEE754 부동 소수점(Floating Pointing) (0) | 2020.04.03 |
[Tech] Protocol Buffer: Serialization에 관하여, 모두가 JSON을 쓴다고 하여 JSON만이 정답일까? (0) | 2020.01.11 |
[Tech] JWT(Json Wet Token)이란? (0) | 2019.12.16 |
[Tech] MSA(Microservice Architecture)란? (0) | 2019.11.13 |