Computer Sience/Security

비밀번호 암호화

제우제우 2024. 8. 28. 14:02

목차

  • 암호화 종류
  • 단방향 암호화 방법
  • 단방향 암호화 문제점 개선 (+ Salt)
  • 단방향 암호화 문제점 개선 (+ Key Stretching)
  • 양방향 암호화 특징 
  • 참고 자료

암호화 종류 

암호화를 하는 이유는 해당 정보가 중요하기 때문이다. ex) 비밀번호

암호화에는 여러가지 방법이 존재

 

단방향 / 양방향 암호 방식이 있다.

 

단방향

단방향은 암호화를 할 수 있어도 복호화해서 원래의 비밀번호를 알 수 없다. 

 

양방향

양방향은 복호화해서 원래의 비밀번호를 알 수 있다. 

양방향 암호화는 대칭형 암호화, 비대칭형 암호화가 존재 

대칭형 암호화와 비대칭형 암호화는 암호화할 때 사용하는 키와 복호화할 때 사용하는 키의 동일성에 대한 

기준으로 구분한다. 


단방향 암호화 방법 

해시함수

같은 입력 값에 같은 출력값이 나오는게 보장,  하지만 출력 값으로 입력값을 유추할 수 없는 것을 의미 

임의의 문자열을 고정된 길이의 다른 문자열로 변경하는 것 

 

단방향 암호화는 Hash 알고리즘을 사용 

md5, sha1, sha256, sha512 

 

일반적인 사이트 비밀번호 찾기 방식 

대부분의 사이트는 비밀번호를 찾을 때 원래의 비밀번호를 알려주는 것이 아닌 재설정 

굳이 복호화할 이유가 없기 때문이다. 

기존에 데이터베이스에 저장된 암호화된 비밀번호와 로그인할 때 입력받은 비밀번호를 단방향 암호화를 통해 비교하면 된다. 기존의 비밀번호는 어디에도 저장되지 않고 암호화된 문자열로만 비교하는 방법

 

여기서 드는 나의 의문점

모든 사이트는 왜 비즈니스가 원래의 비밀번호를 알려주는 것이 아닌 재설정만 있을까? 

복호화가 불가능한게 아닐까? 

 

나랑 똑같이 생각한 사람이 있었다. 

해시 알고리즘을 사용하면 고정된 길이가 나온다. 

 

우리가 비밀번호를 어떻게 입력하든 어떤 조합으로 입력을 하던 해시 알고리즘 사용하면 고정된 자릿수가 나온다.

즉 해시 알고리즘을 사용하면서 데이터 손실이 일어나기 때문에 복호화가 불가능하게 되는 것이다. 

데이터베이스에 단방향으로 암호화되면서 저장이 될 때 데이터 손실이 일어나기 때문에 복호화 해서 기존의 비밀번호를

알려줄 수 없다. (이런 문제점은 비밀번호 길이 제한을 두면 해결할 수 있지 않을까 생각이 든다.) 

 

해시 예시 

이렇게 입력값으로 사용자가 쓴 비밀번호를 단방향 암호화를 해서 데이터베이스에 저장해놓는다면

데이터베이스가 유출되어도 본래 입력 값을 알 수 없으니 보안에 안전해 보인다. (안전하지 않다) 

 

왜 안전하지 않을까? 

이러한 단순 방식은 같은 알고리즘의 같은 인코딩 방식을 선택하여 암호화하면 같은 결과가 나온다 .

 

애초에 해쉬 함수는 속도가 중요하기 때문에 매우 빠르다. 

보안에서는 이 빠른 특징이 공격자에게 좋다.

왜냐하면 모든 입력 값에 대한 출력 값을 정리해놓고, 정리해 놓은 출력 값과 실제 데이터베이스에 저장되어 있는 값을 

일일히 비교하는 작업(브루트 포스)가 가능하기 때문이다. 

 

레인보우 테이블(Rainbow Table)

입력값 - 출력값을 저장해 놓은 것을 레인보우 테이블이라고 한다. 

해시함수(MD-5, SHA-256등)를 사용하여 만들어낼 수 있는 값들을 대량으로 저장한 표가 존재한다.

 

DB를 털고 해시 함수를 통해 복호화 되어 저장된 비밀번호를 레인보우 테이블과 비교해 버린다면 (해당 서비스는 망..) 


단방향 암호화 문제점 개선 (+ Salt)

기존 단방향 암호화 방식은 단순하게 클라이언트가 입력한 PW + 해시 알고리즘을 통한 암호화였으면 

Salt란 PW + Salt(서버에 저장할 문자열) + 해시 알고리즘을 통한 암호화이다. 

 

 

이렇게 하면 해커는 단순하게 레인보우 테이블에서 비밀번호를 찾지 못한다.

이 방식은 JWT 시크릿키 방식과 매우 유사하다. 

JWT에서 시크릿키를 통한 인증 시 시크릿키에 대한 보안이 매우 중요하듯이 소금 정보 보안 또한 매우 중요하다. 

해커가 소금 정보를 알아냈을 때 다른 비밀번호도 쉽게 뚫릴 것이다.(모든 회원이 같은 Salt 사용한다면)


단방향 암호화 문제점 개선 (+ Key Stretching)

키 스트레칭은 솔트와 비밀번호를 해시함수에 넣는 과정은 N번 반복하여 해커가 복호화 하는 것을 아주 힘들게 하는 방법이다. 

 

출력 값을 아주 느리게 산출되도록 하는 방법 

이런 Key Stretching 방식은 레인보우 테이블 제작에 많은 시간과 비용이 들어간다. 

 

암호화 방법에는 pbkdf, scrypt, bcrypt 세가지 방법이 존재 

 

트레이드 오프 

알고리즘이 복잡한 만큼 해시와 이터레이션이 사용되는 시간이 오래 걸려, 해커가 브루트 포스 같은 공격을 하면 

뚫리지는 않을지라도 서버에 많은 부하가 가해지는 역효과가 발생 할 수도 있다. 

Key Stretching 동작 방식 정리 

 

1. 비밀번호 입력: 사용자가 클라이언트에서 비밀번호(예: "1234")를 입력

2. Salt 추가: 서버에 미리 저장된 salt(랜덤 문자열)를 비밀번호에 추가 이 salt는 같은 비밀번호라도 각 사용자마다 서로 다른 해시 값을 가지게 하기 위해 사용

3. 해시 함수 적용: 비밀번호와 salt를 결합한 결과를 해시 함수(예: SHA-256)에 넣어 해시를 계산합니다. 이 과정을 통해 첫 번째 해시 값(digest)을 얻는다.

4. Iteration Count 적용: 얻은 해시 값을 미리 설정해둔 Iteration Count(반복 횟수)만큼 반복하여 해시 함수에 다시 넣어 계산 예를 들어, Iteration Count가 10,000이라면, 해시 함수가 10,000번 반복 수행

5. DB 저장: 마지막 해시 값을 데이터베이스에 저장합니다. 이때 salt도 함께 저장해두어야 나중에 비밀번호를 확인할 때 동일한 salt를 사용할 수 있다. 


양방향 암호화 특징 

대칭키(비공개키) 특징

  • 암호화 / 복호시 같은 키 값 사용
  • AES, DES
  • 키가 탈취되었을 때, 모든 정보가 털린다.
  • 안전하게 사용하기 위해서는 모든 사용자가 서로 다른 키를 가져야 하므로 키 관리를 어떻게 할 것인가? 고민 필요 
  • 키를 안전하게 주고 받는 방법에 대한 고민 필요
  • 이러한 단점들에도 보편적으로 쓰이는 이유는 공개키 암호화에 비해 암/복호화의 속도가 빠르기 때문

비대칭키(공개키) 특징 

  • 암호화 / 복호시 키 값 다르게 사용
  • 암호화 키를 네트워크로 전달 가능 
  • RSA, DSA 
  • 대칭키 방식 보다 약 1000배의 추가 시간 소요 (정확한 내용 x)

키를 교환해야하는 문제(키 배송 문제), 키가 유출되거나, 관리하기에 어려움이 존재하기 때문에 단방향 암호화로 발전되었다.


참고 자료

Inpa Dev [NODE] 📚 crypto 모듈 (단방향 / 양방향) 암호화 원리 & 사용법

 

[NODE] 📚 crypto 모듈 (단방향 / 양방향) 암호화 원리 & 사용법

암호화 종류 암호화를 하는 이유는 해당 정보가 중요하기 때문이다. 암호화에는 여러가지 방법이 있을 수 있다. 대표적으로 단반향과 양방향 암호 방식이 있는데, 단방향은 암호화할 수는 있어

inpa.tistory.com

 

[암호화] 양방향 vs 단방향 암호화 feat. SHA256 foodev

 

[암호화] 양방향 vs 단방향 암호화 feat. SHA256

서비스하는 어떤 회사든, 토이 프로젝트든 로그인/회원가입이 필수적으로 들어간다. 고객 데이터를 통해 맞춤형 정보를 보여주고, 지표를 통한 다양한 마케팅 방식으로 활용할 수 있기 때문이

study-easy-coding.tistory.com

 

개인정보와 암호화(단방향, 양방향 암호화) 정리 [애쿠]

 

개인정보와 암호화(단방향, 양방향 암호화) 정리

1. 암호화의 필요성과 구분 라이브 서비스를 제공하다보면, 사용자의 개인정보를 서버와 주고 받을 일이 생긴다. 이 때 나쁜 마음을 먹은 누군가가 서버와 클라이언트가 주고 받는 패킷을 가로

akku-dev.tistory.com