암호화 - Hash

SSAD·2023년 3월 6일
0

BackEnd

목록 보기
44/44
post-custom-banner

암호화(양방향 암호화)와 해싱(단방향 암호화)

  • 회원가입을 하면 DB에 비밀전호가 그대로 저장

  • DB가 해킹 당하게 되면 해당 서비스 사이트의 이메일과 비밀번호를 가져갈 수 있음

  • 많은 사람들이 여러 사이트에 동일한 이메일과 비밀번호를 사용하는 경우가 많음

  • 다른 서비스까지 추가 해킹을 당하는 일이 발생

  • 기밀성을 유지 하기 위해 DB에 비밀전호를 저장할 때는 비밀번호를 암호화(Encrypt)하여 저장

  • 암호화를 하여 저장하면 암호화에 사용된 키(비밀번호)를 통해 데이터를 복호화 할수 있음

  • 완전히 안전한 암호화가 아니기에 해싱이 나타나게 됨

정의

암호화를 구성하는 요소

  • 평문(Plaintext) : 해독 가능한 형태의 메시지(암호화 전 메시지)
  • 암호문(Cipertext) : 해독 불가능한 형태의 메시지(암호화된 메시지)
  • 암호화(Encryption) : 평문을 암호문으로 변환하는 과정
  • 복호화(Decryption) : 암호문을 평문으로 변환하는 과정

암호화의 종류

Hash는 단방향 암호화 기법

Encryption은 양방향 암호화 기법

양방향 암호화

  • 암호화와 복호화 과정을 통해
    송 수신 간 주고 받은 메시지를 안전하게 암호화하고 평문으로 복호화 하는 과정

단방향 암호화

  • 해싱(Hashing)을 이용한 암호화 방식으로 양방향과는 다른 개념
    평문을 암호문으로 암호화는 가능하지만 암호문을 평문으로 복호화 하는 것은 불가능

Hash(단방향 암호화)

  • 단방향 해시 함수는 어떤 수학적 연산(또는 알고리즘)에 의해 원본 데이터를 매핑 시켜
    완전히 다른 암호화된 데이터로 변환시키는 것을 의미

  • 이 변환을 해시라고 하며, 해시에 의해 암호화된 데이터를 다이제스트(digest)라고 함

  • 해싱은 단방향

  • 단방향 해시 함수는 다이제스트를 복호화, 즉 원본 데이터로 구할 수는 없음

  • 말 그대로 단 방향성

  • 비밀번호를 해시 함수에 돌려서 다이제스트인 암호를 생성 후 해당 암호를 DB에 저장

  • 저장된 다이제스트를 DB누출 된다 하여도 단방향으로 해싱 된 문자라 복호화 할수 없음

단방향 해시 함수의 종류

  • SHA
  • MD
  • HAS
  • WHIRLPOOL

가장 대표적인 해시 알고리즘 SHA-256

key Stretching & Salt

  • 단순히 해시 함수를 이용해서 변환만 한다고 해서 보안이 완벽에 가깝다고 말할 수 없음
  • 어떠한 알고리즘 암호화를 통해 나온 값을 보고 그 값이 나올 수 있는 모든 경우를 스캔하는
    레인보우 테이블을 이용하여 무작정 다 대입해서 복호화 하는 경우가 존재하기 때문
  • 이런 점을 보완하기 위해 생겨난 방법이 키-스트레칭과 솔트

1. Key Stretching

  • 키 스트레칭은 개발자가 횟수를 정해서 Hash 함수를 돌리는 방법

  • 패스워드를 저장할 때 가장 쉽게 생각할 수 있는 방법

  • SHA-256 해시 함수를 사용한다 가정했을 때
    123456이 입력되었다면 123456의 다이제스트는 아래와같음

    8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92

  • 이 다이제스트를 한 번 더 SHA-256에 돌리면 아래와 같음

49dc52e6bf2abe5ef6e2bb5b0f1ee2d765b922ae6cc8b95d39dc06c21c848f8c

  • 그러나 Hash 함수를 여러 번 돌리는 만큼 최종 다이제스트를 얻는데 그만큼 시간이 소요
  • 속도면에서 불리함

2. Salt

  • 여러 번 해시 함수를 돌리더라도 결국 몇 번 돌렸는지 횟수만 알게 된다면,
    공격하는 입장에서 상징성 있는 대표 문자열들을 추려보면 충분히 공격 가능
  • 같은 비밀번호를 사용하는 사용자들이 있다면 하나의 결과를 갖고도 다수 사용자의
    password를 알아낼 수 있음
  • 이를 방지하기 위해 도입한 것이 솔트

솔트(Salt)란 해시 함수를 돌리기 전에 원문에 임의의 문자열을 덧 붙이는 것을 말함

  • 의미 그대로 원문에 임의의 문자열을 붙이는 의미의 소금 친다(Salting)이라고 생각하면 됨

  • 이렇게 하면 다이제스트를 알아낸다 하더라도 password를 알아내기 더욱 어려워짐

  • 다른 Salt를 사용한다면 설령 같은 비밀번호더라도 사이제스트의 값은 달라짐

  • 한 명의 패스워드가 유출되더라도 같은 비밀번호를 사용하는 다른 사용자는 비교적 안전하다는 의미


profile
learn !
post-custom-banner

0개의 댓글