암호화[단방향 과 역방향]

JBoB·2023년 2월 9일
0
post-custom-banner

🐧START

암호화를 해주는 이유는 DB를 해커에게 해킹당할 경우 DB 안에 있는 개인정보를

가져가게 되는데 여기서 암호화를 안하게 된다면 개인정보들이 유출되어 다른 서비스까지 추가 해킹을 당해

큰 피해가 생기게 된다.

하지만 암호화를 해주게 된다면 추가 피해를 막아주고 기밀성도 보장해주므로

요즘은 거의 모든 회사에서 개인정보를 암호화를 하여 DB에 저장하게 되었습니다.

암호화를 하게 되면 그 암호화를 쉽게 해석할 수 있습니다. 그래서 해싱이랑 SALT를 번갈아가면서 하는

키스트레칭을 적용하여 데이터를 복호화 시킬수 있습니다.

이제 자세한 설명은 뒤에서 START~~!

🐤암호화 구성 요소

  • 평문(Plaintext) : 해독 가능한 형태의 메시지(암호화전 메시지)
  • 암호문(Cipertext) : 해독 불가능한 형태의 메시지(암호화된 메시지)
  • 암호화(Encryption) : 평문을 암호문으로 변환하는 과정
    • 중요한 자료를 알고리즘을 이용하여 암호문으로 변화하는 과정
    • ex) 망나뇽 ⇒ 암호화 ⇒ 암호문(”#w#id!a#d21022”)
  • 복호화(Decryption) : 암호문을 평문으로 변환하는 과정
    • 암호문을 원래데이터로 변환하는 과정
    • ex) 암호문(”#w#id!a#d21022”) ⇒ 복호화 ⇒ 망나뇽

🐧양방향 암호화

  • 암호화된 데이터에 대한 복호화가 가능한 암호화 방식이다.
  • 평문을 특정키를 사용해서 해독할 수 없는 형태로 변경한다.

🐤대칭키 암호화 방식 (비공개키)

  • 암 / 복호화에 동일한 키를 사용하는 암호화 방식
  • 키를 사용하여 암호화하기 때문에 키가 노출되면 안된다
    그래서 대칭키는 비공개키라고도 한다.
  • 대칭키는 암호화 복호화 할때 키가 같다.

[출처](https://k0102575.github.io/articles/2020-03/encryption)

단점

  • 키가 같다는 것이 어쩔때는 장점이자 단점으로 볼 수 있다.
  • 중간에서 키를 가로채게 된다면 대칭키를 쓴 이유가 없어진다.
  • 평문을 안전하게 전달할수는 있지만 키는 안전하게 전달할수가 없다.

대표적인 라이브러리

  • **DES(Data Encryption Standard)**
  • **AES(Advanced Encryption Standard)**

🐤비대칭키 암호화 (공개키)

  • 암/복호화에 다른 키를 사용하는 암호화 방식

: 노출시키면 안되는 키를 Private Key , 노출시켜도 상관 없는 키를 Publice Key

라고 한다. 보통의 경우 데이터를 중요하게 다뤄야 하는 서버 측에서는 Private Key 사용

하고 누구나 사용하는 곳에는 Publice Key 를 사용한다.

[출처](https://k0102575.github.io/articles/2020-03/encryption)

장점

  • 대칭키와는 다르게 중간에 키를 가로채도 비밀키로 복호화 하기 때문에
    상관이 없다.

단점

  • 비대칭형 암호방식에 비해 현저하게 느림

🐧단방향 암호화(Hash)

  • Hash(해시)

: 원본 데이터를 매핑시켜 완전히 다른 암호화된 데어터로 변환시키는 것.

  • digest(다이제스트)

: 해시에 의해 암호화된 데이터

비밀번호를 해시 함수로 돌려서 다이제스트를 생성하고 DB에 저장한다.

DB에 저장된 다이제스트가 설령 누출된다고 하더라도 단방향으로 해싱된 문자이기 때문에 복호화 불가.

  • 단방향 암호화

: 암호문을 평문으로 복호화 할수 없는 기법

⇒ 양방향은 키를 이용하여 복호화를 할 수 있지만 단방향은 암호화만 가능하다. 이점 알아가자.!!

🐤단방향에 대해 궁금한 점

비밀번호 복구가 안되는가?

: 단방향은 복호화가 불가능하여 다이제스트가 DB에 저장된다. 수학적으로 복호화가 거의 불가능한 알고리즘을 쓰기 때문에 복구는 불가능하다.

비밀번호를 잃어버린다면 어떻게 찾는가?

: 찾을 방법은 없다.

  • 그래서 대부분 사이트들을 보면 비밀번호 찾기에서 기존 비밀번호를 가르쳐주지 않고 새비밀번호를 생성해서 가르쳐준다. 이유는 암호화된 비밀번호를 다시 복호화해서 평문으로 돌려줄수 없기에 새비밀번호를 생성해주는 것이다.

: 하지만 방법은 있다?

  • 모든 값을 대입해서 해보는것이다. 시간이 굉장히 오래 걸려서 비추한다. 시간낭비…..🤮

🐤 Key Stretching

Key Stretching(키-스트레칭)

: 개발자가 횟수를 정해서 해시함수를 돌리는 방법.

: 패스워드를 암호화 할때 가장 쉽게 생각하는 방법.

해시 함수를 N번 돌릴때 마다 값이 달라져 최종 다이제스트를 얻는다.

하지만 그만큼 시간이 소요되어 속도가 느리다.

여러번 해시 함수를 돌리더라도 횟수만 알게된다면, 해커입장에서는

문자열들을 추려보면 충분히 공격이 가능하다.그래서 이를 방지하기 위해

도입한것이 아래의 Salt 이다.

Salt

: 해시 함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것.

: 의미 그대로 뭔문에 임의의 문자열을 붙이는 의미의 소금친다(Salting)

이를 코드로 적용시키면

// 키스트레칭으로 해커방지
    const hashedPassword = await bcrypt.hash(password, 10);

2의 10승을 키스트레치한 결과 값을 이렇게 불러오게 된다.

profile
간절하고 치열하게 살자
post-custom-banner

0개의 댓글