암호화와 다음 주 과제

김민준·2023년 7월 14일
0
  1. 암호화
  2. 다음 주 과제에 대해

공부하며 느낀 점
참조한 사이트

1. 암호화

암호화의 종류

  1. 단방향 암호화
    장점 : 평문을 암호화 후 복호화가 불가능하다.
    단점 : 항상 같은 해시값이 나온다.
    해시 자체가 빠른 검색을 위한 방식이기 때문에, 레인보우 테이블이라는 해시값을 미리 정리한 값으로 대조하면 매우 빠르게 공격당한다(MD5 장비 사용시 1초에 56억개)

  2. 양방향 대칭키 암호화
    장점 : 암호화키와 복호화키가 같다.
    = 암호화 키를 모르면 복호화 할 수 없다.
    단점 : 양자가 같은 키를 가져야하며, 키가 유출될 수 도 있다.

  3. 양방향 비대칭키 암호화
    장점 : 암호화, 복호화 키가 다르다.
    Public Key - 사용자에게 전달 되는 키, 암호화만 가능하다.
    Private Key - 서버에 저장되는 키, 복호화가 가능하다.
    Public Key 를 사용자에게 주는 과정에서 유출이 된다고 하여도, 암호화만 가능하고 복호화가 불가능하기 때문에, Private Key 만 잘 관리하면 문제가 없다.
    단점 : Private Key 관리에 실패하면 큰 일 난다.

  4. 단방향 암호화의 단점을 해소하기 위한 방법
    단방향 암호화의 단점을 해소하기 위해 만들어진 방법
    솔팅 Salting : 원래 데이터에 추가 데이터를 넣는 방식
    키 스트레칭 Key Stretching : 단방향 해쉬를 반복하는 것.

  5. Bcrypt
    레인보우 테이블 공격을 방지하기 위해 솔팅과 키 스트레칭을 적용한다.
    단방향이기 때문에 복호화가 불가능하다.

$ 2b $ n $ salt + hash $
2b : 해시 알고리즘 식별자
n : 2n2^n만큼 스트레칭한다. (Cost Factor)
salt : Base64로 인코딩된 22 글자 (16 byte 크기)
hash : Base64로 인코이된 31 글자 (24 byte 크기)

복호화가 불가능 하기 때문에 암호화 해시에서 알고리즘, 스트레칭 횟수, 설트값을 이용해서 암호화 한 값이 같은지 비교해야한다.

node.js에서 사용하기

npm install bcrypt --save

//  암호화

// bcrypt 모듈 임포트
const bcrypt = require("bcrypt");

// 암호화할 평문
const password = 'password';
// Cost Factor(암호화할 횟수)
const saltRounds = 12;

// 함수 선언
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'
//  복호화

// 복호화 함수 선언
// 평문을 암호화한 값과 이미 암호화 된 값을 비교한다.
const checkHash = async (password, hashedPassword) => {
  return await bcrypt.compare(password, hashedPassword)
}

// 암호화 함수에 password를 넣고, 해쉬값과 같은 Cost Factor 만큼 암호화 한 뒤 값을 비교한다.
const main = async () => {
  const hashedPassword = await makeHash("password", 12);
  const result = await checkHash("password", hashedPassword);
  console.log(result);
};

// 값이 같다면 True, 다르다면 False 반환
main()
=> true(or false)

2. 다음 주 과제에 대해

게시글 crud / 댓글 crud / 좋아요 / 회원가입+로그인
총 네 개의 역할로 임시 분담을 하고, 발표는 내가 맡기로 하였다.
이유는 최종 정리를 하면서 한 번 더 공부하기 위함이다.

월~수 : 백엔드 완성과 프론트 초안 만들기
목~금 : 버그 수정 및 각자의 프론트 페이지를 통일하고 CSS적용하기
금요일 오후에 완성하고 주말에 간단한 발표 준비를 할 계획이다.

공부하며 느낀 점

  1. 아직은 3 계층 레이어가 헷갈리는 점이 있으므로 한 번 더 공부해야겠다.
  2. 단방향 암호화라는게 복호화가 불가능하다고 해서 어떻게 쓰나 싶었는데, 단순히 입력값이 이미 있는 값과 같은지 비교하는 방식이었다.
  3. 완전한 암호화 방식은 없다고 느꼈다.

참조한 사이트

암호화의 종류와 Bcrypt

profile
node 개발자

0개의 댓글

관련 채용 정보