암호화

이경환·2023년 8월 22일

DB

목록 보기
6/7

들어가기

웹이 폭발적으로 증가하면서 개인정보 유출과 같은 보안 문제도 많아지고있습니다. 보안은 사실 서비스에 있어서 가장 중요한 부분중 하나 이지만 지금까지 개발을 하면서 보안,암호화를 중요한 것은 알았지만 서비스에 도입을 해본다거나 깊은 고민을 해본적은 없는 것 같습니다. 이번 시간에 기본적인 암호화에 대한 원리나 개념에 대해 잘 몰라 간단하게 정리해봤습니다. 이후 꾸준히 보안과 관련된 학습을 해보고자 합니다.

해시(hash)와 암호화(Encryption)

  • 들어가기에 앞서 용어를 정리합니다.
    암호화(Encryption): 평문 -> 암호문
    복호화(Decryption): 암호문 -> 평문
    평문(plain text): 아직 암호화되지 않은 메세지
    암호문(ciphertext): 암호화된 메세지

둘의 차이점을 알아야합니다.

둘 다 암호화 기법이지만 Hash는 단방향 암호화 기법이고 Encryption은 양방향 암호화 기법이다.

일단 방향성에 대해 생각해 볼 필요가있습니다.

Hash는 평문을 암호화된 문장(텍스트)으로 만들어주는 기능을 합니다. 단방향 이기때문에 복호화가 불가능합니다.

Encryption은 평문을 암호화된 문장(텍스트)로 만들어주는 기능을 하고 양방향 이기때문에 암호화된 문장을 다시 복호화 하는 기능도합니다.

암호화(Encryption)를 하기위해서는 암호 키(Encryption Key)가 필요합니다. 암호 키방식은 암/복호화에 따라 세 가지로 나뉩니다.

  • 대칭 암호화(양방향)- 암호키와 복호키가 동일
  • 비대칭 암호화(양방향)- 암호키와 복호키가 다름
  • 혼합 암호화 — 대칭 암호화와 비대칭 암호화 혼합.

정리해 보자면 양방향 방식의 암호화는 암호키라는 것을 통해 교류해 복호화가 가능합니다. 하지만 단방향 방식의 Hash함수를 사용하는 방식은 복호화가 불가능 합니다.

해시(Hash)

용어 정리

일단 용어 정리부터 하고 가겠습니다.

  • 해시(Hash)
    다양한 길이를 가진 데이터를 고정된 길이의 데이터로 매핑한 값을 말합니다.
    우리는 이를 특정 배열의 인덱스나 위치를 데이터 값을 이용해 저장하거나 찾을 수 있습니다.

ex) 123456를 넣을시 8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92 라는 결과 값

  • 해시 함수 (Hash fuction) ,해싱(Hashing)알고리즘
    해시 함수를 사용해 해시 테이블에 데이터를 저장하는 행위를 말합니다.

ex) MD- MD4, MD5, MD6 , SHA — SHA, SHA-1, SHA-2, SHA-3

키 값을 해시 함수에 대입시켜 계산한 후 나온 결과를 주소로 사용하여 값에 접근 할 수 있게 하는 방법을 말합니다.

해싱 알고리즘은 해싱 완료 시, 해시값을 통해 원래 문자열을 알 수 없습니다. 변조 여부만 확인 가능 합니다. (예외적으로 비밀키 사용 시에만 본래 문자열 알 수 있음)

동일 문자열을 동일 해시 알고리즘을 사용 하면 반드시 동일한 해시값이 출력됩니다.
문자열이 다르면 해시값도 다르고, 문자열을 변경하면 해시값도 변경됩니다.

  • 해싱 Hashing
    사용자의 일반 텍스트 암호(평문)를 가져와 단방향 수학 함수를 통해 암호화를 실행하는 것을 말합니다. 이때 해시 라고 하는 고유한 숫자 및 문자 문자열이 생성됩니다.

해싱은 암호화 하는 행위를 말하고 그결과로 해시가 만들어집니다.

특징

  • 해시 알고리즘은 종류가 매우 다양하며 알고리즘은 모두에게 공개 되어 있습니다.
  • 해시 알고리즘마다 Hash 길이가 다르고 이미 보안이 뚫린 해시 함수가 존재합니다.
    그렇기 때문에 MD5, SHA-1, HAS-180 보다는 HA-256, SHA-512등을 사용하는 것이 좋습니다.
  • 해시 알고리즘은 특정 입력 대해 항상 같은 해시 값을 리턴합니다.
    위이 알고리즘 특징에 나와있듯이 같은 해시값을 통해 인증이 가능합니다.
  • 해시된 값은 입력이 다른 값이지만 같을 수 있다.

문제점 , 보완 ex) 솔트(salt)

단방향에서 오는 해시함수는 다음과 같은 문제를 가집니다.

  1. 동일한 메시지는 동일한 값을 갖는다.
  2. 무차별 대입 공격

무차별적으로 임의의 값을 통해 뚫릴수도 있기 때문에 이를 보안하기 위해 나온것이 솔트(salt)와, 해시 함수를 여러번 돌리는 방법 입니다.

비밀번호에 임의의 salt 값을 넣습니다 (넣는 방법도 다양합니다) 이를 사용시 해커에게 털릴경우 한명의 개인정보만 알 수 있을뿐 대량 정보 유출 사태는 방지 할 수 있습니다.

해시 함수는 태생적으로 검색을 빨리 하기 위한 함수 이기때문에 속도가 굉장히 빠릅니다. 해커가 작정하고 검색을 할 경우 뚫릴수 있기 때문에 강제적으로 속도를 늦춰 (해싱 알고리즘을 여러번 실행해 걸리는 시간을 말합니다. 예를 들어 로그인시 0.2~0.5 초로 늦춥니다.) 해킹을 방지합니다.

결론적으로 좋은 해시 함수와 솔트를 이용, 해시 함수를 여러번 적용하는등 해시에 대해 잘이해하고 사용해 해킹을 방지합니다. 참고로 Spring security 의 bcrypt 또한 강패스워드를 위해 탄생한 강력한 해시 알고리즘이 적용된 예시로 볼수 있습니다.

DB에는?

위의 내용을 토대로 만약 DB에 저장할 때를 생각해보겠습니다.
비밀번호를 생성하거나 초기화(참고로 비밀번호를 잊었을 때 그전의 비밀번호를 그대로 반환하는 것은 매우 위험하며 보통 비밀번호를 재설정합니다. 이는 DB에서 비밀번호를 그대로 저장하지 않으며,또는 복호화 못시키기 때문인 것 같습니다.)
할 때 랜덤값으로 솔트를 생성하여 비밀번호에 더해 hashing한 뒤, DB에 아이디와 이에 대응하는 해싱 된 비밀번호, 솔트를 저장해두게 됩니다.
ID, password(해싱 된), salt 이렇게 저장될 겁니다.

암호화(Encryption)

OWASP 10대 취약점

오픈 웹 애플리케이션 보안 프로젝트(OWASP)에서 웹 애플리케이션 보안에 관한 가장 중요한 10가지 위험을 설명합니다

정기적으로 업데이트 하고 있으며 개발을 하며 항상 인지하며 취약점을 신경써야합니다. 항목을 모두 설명하는 글은 아니여서 개발을 할 때 취약점을 인식하고 지키려고 해야합니다.

관련된 글을 읽다보니 생각보다 보안에 취약한 웹 애프리케이션이 매우 많습니다. 그중 이번 글의 주제인 암호화는 2022년기준 5위에 링크 되어있습니다.

자료에 따르면 무려 약 90%의 애플리케이션이 모종의 설정 오류가 있는 것으로 나타났습니다.

암호화 실패의 원인은 데이터가 일반 텍스트나 오래된 알고리즘을 사용하여 전송될 때 발생합니다. 안전하지 않은 키 관리 및 로테이션 기술도 암호화 실패의 원인이 될 수 있습니다.

개인정보를 평문으로 저장한다거나 오래된 알고리즘 예를들어 해쉬 알고리즘 (MD5, SHA-1, HAS-180)을 사용해서는 안됩니다.

기존의 인젝션 공격이나,방화벽 정책등은 알고있었지만 의외로
불안전한 디자인도 링크되어있었습니다.

불안전한 디자인패턴이나 잘못된 설계 또한 취약점인 것을 보면 설계 또한 매우 중요한 것을 알 수 있습니다.

https://owasp.org/www-project-top-ten/
https://www.appsealing.com/kr/2022-owasp-10%EB%8C%80-%EC%B7%A8%EC%95%BD%EC%A0%90/

마무리

완변한 보안은 없다고 합니다. 결국은 엄청난 수의 컴퓨터를 돌리거나, 키를 탈취하는 등 보안에서 완벽함은 존재하지 않고 결국은 개발자가 이를 최대한 방어해야 한다고합니다. 그래서 매우 중요한 개인정보는 되도록 인터넷에 올리지 않도록 하고 비밀번호나 기타 중요 개인정보를 평문으로 DB에 저장한다거나 하는 행동은 매우 위험한 행동이며 개발자는 개인정보를 어떻게 최대한 보안유지 할지 꾸준히 생각하는 서비스가 좋은 서비스라고 생각합니다. 보안은 개발자의 평생의 숙제인 것 같습니다.

profile
개선하는 개발자, 이경환입니다

0개의 댓글