avatar
Steady

[Security] 암호화에 대한 이해

Security
3 months ago
·
5 min read

until-1663

암호화란?


암호화는 데이터를 허가 받지 않은 사용자가 알아보기 어렵게 만들고, 허가 받은 사용자는 알아볼 수 있게 하는 것을 뜻한다.

특히 타인이 취득하여 악용할 소지가 있는 데이터들을 주로 암호화 처리해서 보관한다. (ex. 휴대폰 번호, 주민등록번호 등)

학습 전에 헷갈렸던 부분

: 해시 함수를 이용한 데이터 변환은 복호화가 불가능 하기 때문에 암호화에 속하지 않는다.

해쉬 함수를 이용한 보안 기법이라고 부르는 것이 맞다.

어떤 방식이 있나?


대칭키 암호화( ex. AES, DES 등 )

: 데이터를 암호화 할때 쓰는 키값과 데이터를 복호화 할때 쓰는 키값동일한 암호화 방식

  • 하나의 키를 이용해 암복호화가 쉽지만, 키 값을 공유하여 사용할 때 각별한 주의를 기울여야 한다.

"안녕" -(비밀키)-> "62758dda68a287fd310ee918d070fcac" -(비밀키)-> "안녕" 

비대칭키 암호화( ex. RSA, ECC 등 )

: 데이터를 암호화 할때 쓰는 키와 데이터를 복호화 할때 쓰는 키다른 암호화 방식

  • 키를 사전에 공유하지 않아도 이용이 가능해 안전하지만, 대칭키 방식에 비해 속도가 느리고 충분한 보안성을 위해서는 긴 길이의 키가 필요해 암복호화 연산이 복잡해 자원을 많이 소모한다.

공개키? 개인키?

: 암호화 키를 생성할 때 공개키와 개인키 두 개의 쌍으로 생성을 한다.

공개키는 데이터를 암호화 할때, 개인키는 데이터를 복호화 할때 사용한다.

  • 모두에게 공개된 공개키 값을 이용해 암호화 된 값을 서버로 보내면 서버에서 개인키로 복호화 하여 데이터를 확인하는 순서다.

  • 개인키는 공개되지 않고 서버에서만 사용해 공유 중에 유출 될 가능성이 없다.

"안녕" -(공개키)-> "CO//3lsN30ryl8EXFV0Oubq2erPoP4DfedM0zRnLjOiet81uo4gtzKp3H3DpBJkq/lY3547jVK7jArbwO1EA6w==" -(개인키)-> "안녕"

그래서 뭘 쓰면 좋을까?


일반적인 상황이라면 보안성이 더 뛰어난 비대칭키 암호화 방식

서버의 성능이 좋지 않거나 대량의 데이터를 전송할때는 대칭키 암호화 방식

돌아보며


부끄럽지만 나는 "개발할때 무슨 암호화 방식을 사용하셨나요?" 라는 질문에 "Base64 요" 라는 이상한 답변을 한 적이 있다. 답을 들은 면접관은 "그건 암호화 방식이 아닌데요" 라고 답하였고, 나는 그 당시에는 내가 뭘 잘못 말한지 몰랐었다. (물론 시원하게 탈락했다.)

암호화 파트를 개발했었지만, 기능이 동작할 정도만 찾아보고 자세한 내용은 모르고 개발을 해왔던 것이다. 누군가 이 글을 읽고 나와 같은 멍청한 실수를 방지했으면 한다.







여기서는 꾸준해보자