암호화의 종류, Bcrypt_11.8

송철진·2022년 11월 7일
0

요약

  • 단방향 암호화: 해시 알고리즘을 사용하여 암호화는 가능하지만 복호화는 불가능한 암호화 방법.
  • 솔팅(Salting)과 키 스트레칭(Key Stretching) 기법: 단방향 암호화의 단점 보완
  • Bcrypt
    • 레인보우 테이블 공격을 방지하기 위해 솔팅과 키 스트레칭을 적용한 대표적인 예.
    • 단방향 해시 알고리즘이기 때문에 복호화 불가능. 따라서 비교하고 싶은 평문을 암호화된 값이 가지고 있는 알고리즘, Cost Factor, Salt을 이용하여 해시를 진행한 후 암호화된 값과의 비교를 통해 검증을 진행
  • 양방향 암호화에는 대칭키 방식과 비대칭키 방식이 존재.
    암호화와 복호화를 진행 시 Key 이용
  • 대칭키 방식의 양방향 암호화: 암호화 & 복호화에 동일한 Key 사용
    Key 노출 시 보안 취약
  • 비대칭키 방식의 양방향 암호화: 암호화 & 복호화에 서로 다른 Key 사용
    Key 노출 문제 해결

1. 단방향 암호화

평문을 암호화 할 수는 있지만 복호화가 불가능한 암호화 방법
주로 해시 알고리즘을 이용해 구현

왜 쓸까?

  • 메시지 또는 파일의 무결성(integrity)을 보장하기 위함
  • 원본의 값이 1bit라도 달라지면 해시 알고리즘을 통과 후의 해시값이 매우 높은 확률로 달라지는 성질을 이용해 메시지나 파일이 원본인지 아닌지 확인 가능

활용

  • 저자서명, 파일 또는 데이터의 식별자, 사용자의 비밀번호, 블록체인

대표적인 해시 알고리즘 : MD5, SHA

한계

  • 해시 알고리즘은 동일한 평문에 항상 동일한 해시값
    • 특정 해시 알고리즘에 대해 어떤 평문이든 해시값을 알 수 있음.
    • 레인보우 테이블: 해시 함수의 해시 값들을 대량으로 정리한 테이블
    • 레인보우 공격: 레인보우 테이블을 이용해 사용자의 정보를 해킹하는 공격
  • 본래 용도: 데이터의 빠른 검색용(처리속도 빠름)
    • 공격자가 매우 빠른 속도로 임의의 문자열의 해시값과 해킹 대상의 해시값을 비교해 대상자를 공격 가능.
      예) MD5 사용 시, 일반적인 장비로 해시값 56억 개/초 비교 가능!

레인보우 색상 폰트 - 출처 링크

1-3. 솔팅(Salting) & 키 스트레칭(Key Stretching)

솔팅(Salting)
단방향 해시 함수를 통해, 본래 데이터에 랜덤 데이터를 더해 암호화하는 방식
(원래 데이터) <==(해시값이 다름!)==> (원래 데이터+추가 데이터)

소금(salt), 조미료를 솔솔솔 뿌리듯이 랜덤 데이터를 더한다

키 스트레칭(Key Stretching)
단방향 해시값 계산 후, 그 해시값을 다시 해시하고 또 이를 반복하는 방식

  • 1초에 50억 개 이상의 해시값을 비교할 수 있는 일반적인 장비로 키 스트레칭이 적용되면 1초에 5번 정도만 비교 가능.
  • GPU(Graphics Processing Unit)를 사용해도 1초에 수백~수천 번 정도만 비교 가능.

암호화한 결과물을 역산하는게 아닌
동일한 방식의 암호화한 결과물을 서로 비교하는 방식

왜 난수화된 패스워드가 필요할까?
DB작업은 사람이 한다! DB에 접근해서 가입자의 개인정보를 악용하는 사람이 있을 수 있으므로 암호화가 필요하다

ex) Bcrypt

  • 브루스 슈나이어가 설계한 키(key) 방식의 대칭형 블록 암호에 기반을 둔 암호화 해시 함수로서 Niels Provos 와 David Mazières가 설계했다.
  • 레인보우 테이블 공격을 방지하기 위해 솔팅과 키 스트레칭을 적용한 대표적인 예

구조

$2b$12$76taFAFPE9ydE0ZsuWkIZexWVjLBbTTHWc509/OLI5nM9d5r3fkRG
 \/ \/ \____________________/\_____________________________/
Alg Cost       Salt                        Hash

2b : 해시 알고리즘 식별자
12 : Cost Factor로 Key Stretching의 수 (2의 12승번)
76taFAFPE9ydE0ZsuWkIZe : 16Byte 크기의 Salt, Base64로 인코딩된 22개의 문자
xWVjLBbTTHWc509/OLI5nM9d5r3fkRG : 24Byte의 해시 값, Base64로 인코딩된 31개의 문자

검증

  • 단방향 해시 알고리즘이므로 복호화가 불가능하다.
  • Bcrypt의 검증은 비교하고 싶은 평문을 암호화된 값이 가진 알고리즘, Cost Factor, Salt을 이용하여 해시를 진행한 후 암호화된 값과의 비교를 통해 검증한다.

2. 양방향 암호화 - 대칭키

양방향 암호화
평문의 암호화와 암호문의 복호화가 모두 가능한 암호화 방법
암호화 알고리즘과 키(Key)을 이용, 이 키를 통해서 암호화된 값을 보호

대칭키 방식
암호화 키와 복호화 키가 동일한 암호 시스템
암호화 키를 모르면 해당 암호문은 복호화 불가능.

대표적인 대칭키 양방향 알고리즘 : AES

  • AES는 128, 192, 256 비트의 정해진 길이의 키를 사용.
  • 암호화 키는 적절한 길이를 써야 한다
    : 길고 복잡 => 보안성 높지만, 컴퓨터 자원이 많이 필요

한계

  • 다른 사람과 대칭키 기반 암호화 통신 시, 상대방도 사전에 동일한 하나의 키가 필요함
    👉 키를 주고 받는 과정에서 키 유출 우려(암호화 통신 해킹 가능)
  • 여러 상대방과 통신 시, 각각의 키를 관리하기 어려움

3. 양방향 암호화 - 비대칭키

비대칭키 암호화
암호화 키와 복호화 키가 서로 다른 암호화 방식
Key Pair = Public Key(다른 사람들에게 공개) + Private Key(절대 노출X)
👉 키 탈취 문제, 관리의 단점 부분을 보완

3-2. 데이터 암호화 과정

  1. 서버에 Key Pair 발급 후 Public Key를 사용자에게 전달
  2. 사용자는 데이터 암호화 시, 서버에서 받은 Public Key을 사용
  3. 서버는 사용자가 보낸 암호화된 데이터를 Private Key로 복호화, 내용 확인

👉 해커가 Public Key와 사용자가 서버로 보낸 데이터를 훔쳐도 그 데이터 확인할 수 없다. 서버가 가지고 있는 Private Key로만 복호화 가능함!
👉 Private Key는 절대 공개하면 안됨!

3-3. 전자 서명

종이문서의 서명(인감)과 같이 전자문서에 서명한 사람이 누구인지 확인하고 서명된 전자문서의 위·변조사실을 알 수 있도록 전자문서에 부착하는 특수한 형태의 디지털 정보

비대칭키 암호화를 통해 구현
비대칭 암호화의 Key Pair = 종이문서의 인감도장과 인감증명의 역할. Private Key(인감도장)는 서명자만 보관해서 사용,
공개된 Private Key(임감증명) 통해 서명의 진위여부 확인

비대칭키를 이용한 전자서명 과정

  1. A가 Key Pair 발급 후 Public Key를 공개
  2. A가 메시지 작성, 본인의 전자 서명 기입
    전자 서명 = A가 작성한 메시지의 내용을 Private Key로 암호화한 값
  3. 받은메시지의 작성자가 A인지 B가 검증하려면?
    👉 B는 공개된 A의 Publick Key로 전달 받은 전자서명을 복호화
    👉 복호화 내용과 메시지 내용이 일치하면 검증 완료!
profile
검색하고 기록하며 학습하는 백엔드 개발자

0개의 댓글