- 암호화
- 다음 주 과제에 대해
공부하며 느낀 점
참조한 사이트
단방향 암호화
장점 : 평문을 암호화 후 복호화가 불가능하다.
단점 : 항상 같은 해시값이 나온다.
해시 자체가 빠른 검색을 위한 방식이기 때문에, 레인보우 테이블이라는 해시값을 미리 정리한 값으로 대조하면 매우 빠르게 공격당한다(MD5 장비 사용시 1초에 56억개)
양방향 대칭키 암호화
장점 : 암호화키와 복호화키가 같다.
= 암호화 키를 모르면 복호화 할 수 없다.
단점 : 양자가 같은 키를 가져야하며, 키가 유출될 수 도 있다.
양방향 비대칭키 암호화
장점 : 암호화, 복호화 키가 다르다.
Public Key - 사용자에게 전달 되는 키, 암호화만 가능하다.
Private Key - 서버에 저장되는 키, 복호화가 가능하다.
Public Key 를 사용자에게 주는 과정에서 유출이 된다고 하여도, 암호화만 가능하고 복호화가 불가능하기 때문에, Private Key 만 잘 관리하면 문제가 없다.
단점 : Private Key 관리에 실패하면 큰 일 난다.
단방향 암호화의 단점을 해소하기 위한 방법
단방향 암호화의 단점을 해소하기 위해 만들어진 방법
솔팅 Salting : 원래 데이터에 추가 데이터를 넣는 방식
키 스트레칭 Key Stretching : 단방향 해쉬를 반복하는 것.
Bcrypt
레인보우 테이블 공격을 방지하기 위해 솔팅과 키 스트레칭을 적용한다.
단방향이기 때문에 복호화가 불가능하다.
$ 2b $ n $ salt + hash $
2b : 해시 알고리즘 식별자
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)
게시글 crud / 댓글 crud / 좋아요 / 회원가입+로그인
총 네 개의 역할로 임시 분담을 하고, 발표는 내가 맡기로 하였다.
이유는 최종 정리를 하면서 한 번 더 공부하기 위함이다.
월~수 : 백엔드 완성과 프론트 초안 만들기
목~금 : 버그 수정 및 각자의 프론트 페이지를 통일하고 CSS적용하기
금요일 오후에 완성하고 주말에 간단한 발표 준비를 할 계획이다.