TIL 2023. 4. 1.

TIL #014

오늘 개발한 것

BookStack

레포지토리 링크 ( FE , BE )

  • 회원가입 구현
    • BE ) 비밀번호 암호화 구현 ( feat. bycrypt )
    • BE ) signup db 저장 로직 구현
    • FE ) signup Input values 조건 확인 로직 구현
    • FE ) BE에서의 응답에 따른 로직 및 라우팅 구현
  • 로그인 구현
    • BE ) 아이디 존재 여부 확인 & 비밀번호 확인 로직 구현 ( feat. bycrypt )
    • BE ) JWT 발행 및 프론트엔드로의 RES 로직 구현 ( feat. jsonwebtoken )
    • FE ) 아이디 & 비밀번호 조건 확인 로직 구현
    • FE ) 응답에 따른 로직 및 JWT 저장 로직 구현 ( feat. localStorage )

 

Tistory Blog

 

오늘 공부한 것

암호화

단방향 암호화

평문에서 해시 등의 방식을 통해 암호화하는 방식.

암호화된 문자를 다시 평문으로 되돌리는 것은 불가능하다.

특징 :

무결성의 특징을 가지고 있으며, 이 같은 특징으로 인해 주로 저자 서명, 파일/데이터 식별자, 사용자 비밀번호, 블록체인 등의 분야에서 사용되고 있다.

*무결성 : 완전성, 일관성, 정확성을 유지할 수 있는 특성

한계 :

  1. 레인보우 테이블을 이용한 레인보우 공격에 취약하다.
  2. *레인보우 테이블 : 해시 함수의 해시 값들을 대량으로 정리해 둔 테이블. 이를 통해 특정 알고리즘을 통해 해석된 특정 값이 어떻게 암호화되는지 알 수 있다.
  3. 해시의 알고리즘이 빠른 만큼 해커또한 짧은 시간 안에 비교적 많은 공격이 가능하다.

보완 방법 :

  1. 솔팅
  2. 해시를 통한 단방향 암호화를 진행할 때, 본래 데이터에 추가로 랜덤 데이터를 추가하여 암호화를 진행하는 방식. (기존 암호화된 데이터에 소금(랜덤 데이터)을 소금소금)
  3. 키 스트레칭
  4. 해시를 반복하는 방법. 해시를 여러번 해야만 하도록 만들어 해커의 공격 횟수를 줄일 수 있도록 한다. (해시를 1번만 하면 1초에 50억 개 이상의 공격이 가능하지만, 키 스트레칭을 통해 1초에 5번 정도의 공격만 가능하도록 할 수 있다.)

 

양방향 암호화 - 대칭키

암호화 알고리즘과 키를 이용하여 암호화 하는 방식.

키를 통해 암호화된 값을 보호할 수 있다.

키를 통해 암호화와 복호화가 이루어 지며, 키를 잃어버리게 된다면 해당 암호문은 다시 복호화할 수 없다.

대표적 양방향 암호화 알고리즘

AES : 128, 192, 256 비트의 정해진 길이의 키를 사용

한계

하나의 대칭키로 암호화, 복호화 모두가 이루어 지기에 대칭키가 유출되면 해당 값이 유출될 위험이 커진다.

특히 키를 주고 받는 과정에서 해당 키가 탈취될 가능성이 있다.

양방향 암호화 - 비대칭키

암호화 알고리즘과 서로 다른 두 개의 키를 이용하여 각각 암호화, 복호화하는 방식.

암호화할 때 필요한 키와 복호화할 때 필요한 키가 다르기 때문에 기존의 대칭키 방식의 양방향 암호화보다 보안성이 높다는 특징이 있다.

키는 일반적으로 다른 사람들에게 공개되는 Public key와 절대 노출하지 않는 Private key가 있으며, 이 둘을 합쳐 Key Pair라고 부른다.

 

 

Bcrypt

브루스 슈나이어가 설계한 키(key) 방식의 대칭형 블록 암호에 기반을 둔 암호화 해시 함수

구조

$2b$12$76taFAFPE9ydE0ZsuWkIZexWVjLBbTTHWc509/OLI5nM9d5r3fkRG
 \\/ \\/ \\____________________/\\_____________________________/
Alg Cost       Salt                        Hash
  • 2b : 해시 알고리즘 식별자
  • 12 : Cost Factor로 Key Stretching의 수 (2의 12승 번)
  • 76 taFAFPE9 ydE0 ZsuWkIZe : 16Byte 크기의 Salt, Base64로 인코딩 된 22개의 문자
  • xWVjLBbTTHWc509/OLI5 nM9 d5 r3 fkRG : 24Byte의 해시 값, Base64로 인코딩 된 31개의 문자

설치

$ npm i bcrypt

사용

const bcrypt = require("bcrypt");

const password = 'password'; // 임의의 비밀번호
const saltRounds = 12; // Salting할 횟수, number타입이어야 한다.

const makeHash = async (password, saltRounds) => {
  return await bcrypt.hash(password, saltRounds);
}

const main = async () => {
  const hashedPassword = await makeHash(password, saltRounds);
  console.log(hashedPassword);
}

main()
=> b'$2b$12$76taFAFPE9ydE0ZsuWkIZexWVjLBbTTHWc509/OLI5nM9d5r3fkRG'

 

 

 

API Status Code

200

200 : OK ( 클라이언트의 요청을 서버가 정상적으로 처리 )

201 : Created ( 클라이언트의 요청을 정상적으로 처리했으나, 새로운 리소스가 생성됨 )

202 : Accepted ( 클라이언트의 요청은 정상적이나, 아직 서버가 요청을 처리하지 못함 )

400

400 : Bad Request ( 클라이언트의 요청이 유효하지 않아 더 이상 작업을 진행하지 않음 )

401 : Unauthorized ( 클라이언트의 신원을 알 수 없기 때문에 작업을 진행할 수 없음 )

403 : Forbidden ( 클라이언트가 권한이 없기 때문에 작업을 진행할 수 없음 )

404 : Not Found ( 클라이언트가 요청한 자원이 존재하지 않음)

500

Server Errors ( 서버 측에 문제가 있음 )

 

 

오늘 개발한 것

BookStack

 

 

  • 회원가입 구현 
    • BE ) 비밀번호 암호화 구현 ( feat. bycrypt )
    • BE ) signup db 저장 로직 구현
    • FE ) signup Input values 조건 확인 로직 구현
    • FE ) BE에서의 응답에 따른 로직 및 라우팅 구현
  • 로그인 구현
    • BE ) 아이디 존재 여부 확인 & 비밀번호 확인 로직 구현 ( feat. bycrypt )
    • BE ) JWT 발행 및 프론트엔드로의 RES 로직 구현 ( feat. jsonwebtoken )
    • FE ) 아이디 & 비밀번호 조건 확인 로직 구현
    • FE ) 응답에 따른 로직 및 JWT 저장 로직 구현 ( feat. localStorage )

'TIL' 카테고리의 다른 글

TIL #017  (0) 2023.04.04
TIL #016  (0) 2023.04.03
TIL #013  (0) 2023.04.01
TIL #012  (0) 2023.03.30
TIL #011  (0) 2023.03.29