암호화(Encryption)란 무엇인가?
암호화는 어떤 내용을 다른 사람이 못 알아보게 변경하는 것입니다. 그럼 왜 변경하는가. 외부에 유출되거나, 다른 사람이 알면 민감한 자료 등은 변경해서 저장해야 합니다.
암호화란
암호화(暗號化) 또는 엔크립션(encryption)은 특별한 지식을 소유한 사람들을 제외하고는 누구든지 읽어볼 수 없도록 알고리즘을 이용하여 정보(평문을 가리킴)를 전달하는 과정이다. 이러한 과정을 통해 암호화된 정보(암호문)를 낳는다. 이에 역행하는 과정을 해독 또는 디크립션 (decryption)이라고 하며 이로써 암호화된 정보를 다시 읽을 수 있다.
- 위키백과 '암호화' 中 -
암호화는 특정 데이터가 타인에게 노출되더라도 원문 내용을 알 수 없도록 다른 문구로 변경해서 저장해 놓는 것을 이야기합니다.
암호화의 예를 들어보겠습니다. 저는 저만 알아볼 수 있는 문구를 제 메모장에 저장해 놓고자 합니다. 그래서 '0805121215'라고 작성해놓습니다. 규칙을 알기 전에는 다른 사람들은 알지 못합니다. 규칙을 알고 있는 저만 알 수 있죠. 이 예시의 규칙은 간단합니다. A는 01로, B는 02, 그리고 C는 03이라고 변환합니다. 이런 식으로 A부터 Z까지 숫자를 부여합니다. 그럼 '0805121215'는 무슨 단어일까요? 'HELLO'입니다. 규칙을 알기 전까지는 다른 사람이 저 메모를 보더라도 무슨 내용인지 알지 못합니다. 규칙을 알고 있는 사람들은 다른 문구도 숫자 형태로 바꿀 수 있습니다. 당연히 현실에서의 암호화는 훨~~씬 더 복잡합니다.
활용
암호화를 해주는 알고리즘(처리 절차나 방법)은 크게 단방향 알고리즘, 양방향 알고리즘으로 나누어집니다.
단방향 알고리즘은 원문을 암호화하면 임의의 문자열로 변경되는데, 그걸 원문으로 되돌리는 것은 불가능합니다. 일반적으로 해시함수라는 기능을 주로 사용합니다. MD5, SHA-256, SHA-512 등이 있습니다.
1234 -> 해시 암호화(SHA256) -> 03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4
예를 들어 '1234'라는 값을 SHA-256으로 암호화할 경우, '03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4' 라는 값이 나옵니다. 참고로 해시 알고리즘은 입력값과 상관 없이 항상 같은 길이의 결과를 반환합니다. 그럼 암호화되고 나면 원문도 알 수 없게 되는데 이런 걸 어디에 사용할까요? 다시 원문으로 돌릴 필요가 없는 경우 주로 사용합니다. 일반적인 서비스들의 회원 비밀번호는 해시화해서 데이터베이스에 저장합니다. 로그인할 때는 사용자가 입력한 비밀번호를 해시화 한 후에 데이터베이스에 저장된 값과 비교합니다. 해시함수는 같은 값에 대해서는 항상 같은 결과가 나옵니다. 사용자가 입력한 비밀번호의 해시화된 결과와 데이터베이스에 해시화 되어 있는 값이 일치하면 비밀번호가 맞는 것이죠. 이렇게 하는 이유는 서비스의 운영자도 회원의 비밀번호를 알 수 없게 만들어 줍니다. 그리고 행여 데이터베이스가 해커에 의해 노출된다 하더라도, 해시화 되어 있는 비밀번호로는 원문을 알 수 없습니다. 만일 원문 그대로 데이터베이스에 저장해놨다가, 해커에 노출되면 난리 나겠죠. 대부분의 회원들은 다양한 사이트들의 아이디와 비밀번호를 똑같이 해놓으니까요. 원래의 내용과 일치하는가 아닌가 하는 기능을 사용할 때 단방향 알고리즘은 많이 사용됩니다.
양방향 알고리즘은 우리가 일반적으로 생각하는 암호화를 이야기합니다. 어떤 문구를 암호화하고, 필요할 때 복호화해서 원문의 내용을 알아내서 사용하는 것이죠. 양방향 알고리즘은 암호키의 대칭 여부에 따라 대칭형 알고리즘, 비대칭형 알고리즘으로 나눠집니다. 대칭형 알고리즘은 암호화할 때 '암호키'를 이용해서 암호화하고 동일한 '암호키'를 복호화 할 때도 사용하는 것입니다. 비대칭형 알고리즘은 암호화할 때의 '암호키'와 복호화할 때의 '암호키'가 다릅니다.
대칭형 알고리즘은 이해하기는 쉽습니다. '이 정도 개념만 알아도 됩니다.'라는 값에 '1234'라는 암호키 이용해서 암호화를 했더니 '149ugqlkj394glkgj934glqkrgj94gjalkfg94gjag'라는 값이 나옵니다. 그래서 원문을 알고 싶어서 '149ugqlkj394glkgj934glqkrgj94gjalkfg94gjag'라는 값을 '1234'라는 암호키를 이용해 복화화 했더니 '이 정도 개념만 알아도 됩니다.'가 나옵니다. 우리가 생각하는 일반적인 암호문입니다. AES가 대표적인 대칭형 알고리즘입니다. 그런데 문제는 'passkey'라는 암호키를 수신자에게 전달하기가 어렵다는 것입니다. 혹시 중간에 누군가 이야기를 엿듣는다면 암호문이 제3자에게 해석될 테니까요.
비대칭형 알고리즘은 암호화와 복호화할 때 암호키가 다릅니다. '이 정도 개념만 알아도 됩니다.'라는 값에 '1234'라는 암호키 이용해서 암호화를 했더니 '149ugqlkj394glkgj934glqkrgj94gjalkfg94gjag'라는 값이 나옵니다. 그래서 원문을 알고 싶어서 '149ugqlkj394glkgj934glqkrgj94gjalkfg94gjag'라는 값에 '1394857'라는 암호키를 이용해 복화화 하면 '이 정도 개념만 알아도 됩니다.'가 나옵니다. '149ugqlkj394glkgj934glqkrgj94gjalkfg94gjag'라는 값은 '1234'로는 복호화가 되지 않습니다. '1394857'로만 복호화가 됩니다. 그래서 수신자에게 메시지를 보낼 때 '넌 앞으로 나한테 뭐 보낼 때 '1234'를 이용해서 암호화 해'라고 합니다. 이렇게 다른 사람에게 노출되도 되는 암호키를 공개키라고 합니다. 공개키는 노출돼도, 어차피 그걸로는 복호화 할 수 없습니다. 나만 알고 있는 '1394857'로만 복호화가 되기 때문입니다. 물론 여기서 '1394857'는 절대 노출되면 안되겠죠. 이렇게 개인만 알고 있어야 하는 키를 개인키라고 부릅니다. 대표적인 비대칭형 알고리즘에는 RSA암호화가 있습니다.
문제는 비대칭형 알고리즘은 느립니다. 그래서 대칭형과 비대칭형을 섞어서 운영합니다. 상대에게 암호키를 전송할 때 비대칭형 알고리즘으로 전송한 후, 전달된 암호키를 이용해 대칭형 알고리즘을 통해 통신합니다.
정리
암호화 알고리즘은 개발자가 아닌 이상, 직접 사용할 일은 없습니다. 게다가 많은 개발자들도 암호 알고리즘을 자세히 알지 못하고, 그냥 사용만 하는 수준으로 운영합니다. 저도 마찬가지입니다. ㅎㅎㅎ;; 암호화 알고리즘은 복잡해서 암호를 전문하는 사람들이 지금도 계속 연구하고 있습니다. 여기서는 '내가 입력한 자료들이 이렇게 저장되는구나' 정도로, 알아두시면 됩니다. 서비스 운영자도 회원 비밀번호는 알 수 없습니다. 그래서 비밀번호 모른다고 비밀번호 찾기를 요청하면, 비밀번호는 못알려주고, 재설정만 가능합니다. 이외에도 다양한 보안 관련 기능들이 있는데요. 두루두루 살펴봐 놓으시길 추천합니다. ㅎㅎ
'IT 인터넷 > 비개발자를위한IT지식' 카테고리의 다른 글
API란 무엇인가 (0) | 2020.04.24 |
---|---|
UI 용어 컴포넌트 이름 소개 (1) | 2020.04.23 |
CLI, GUI, NUI란 무엇인가 (0) | 2020.04.22 |
URL이란 무엇인가 (0) | 2020.04.16 |
리눅스(Linux)란 무엇인가 (0) | 2020.04.06 |